【问题标题】:c++ localtime when changing timezone更改时区时的c ++本地时间
【发布时间】:2012-02-08 02:20:03
【问题描述】:

我有一个使用 localtime() 的设置来获取一个带有本地时间的 tm。这一切都很好。

但是,如果我在应用程序运行时更改时区,它不会注意到我已更改时区。

有没有办法告诉它“再看一遍”以刷新到系统时区?

我知道这可能不是一个常见的情况,但这是测试正在做的测试这个功能,所以他们希望它得到支持!

【问题讨论】:

    标签: c++ localtime


    【解决方案1】:

    看看tzset(这只是posix)。这可能会给你你需要的东西。如果您的TZ 环境变量未设置,它应该从操作系统重新初始化。

    来自手册页:

    描述

    tzset() 函数从 TZ 环境变量初始化 tzname 变量。这个函数是自动调用的 其他依赖于时区的时间转换函数。在一个 类似 SysV 的环境,它还将设置变量时区 (格林威治标准时间以西的秒数)和日光(如果该时区不是,则为 0 有任何夏令时规则,如果有时间则非零 在夏令时适用的一年中)。

    如果环境中没有出现 TZ 变量,则 tzname 变量使用局部的最佳近似值进行初始化 挂钟时间,由 tzfile(5) 格式文件 localtime 指定 在系统时区目录中找到(见下文)。 (一个也经常 看到这里使用的 /etc/localtime,一个指向正确文件的符号链接 系统时区目录。)

    一个简单的测试:

    #include <iostream>
    #include <time.h>
    #include <stdlib.h>
    
    int main()
    {
            tzset();
    
            time_t t;
            time(&t);
    
            std::cout << "tz: " << tzname[0] << " - " << tzname[1] << " " << ctime(&t) << std::endl;
    
            setenv("TZ", "EST5EDT", 1);
            tzset();
    
            std::cout << "tz: " << tzname[0] << " - " << tzname[1] << " " << ctime(&t) << std::endl;
    
            return 0;
    }
    

    给我输出:

    tz:CST - CDT 2012 年 1 月 11 日星期三 12:35:02

    tz: EST - EDT 2012 年 1 月 11 日星期三 13:35:02

    【讨论】:

    • 不幸的是,我们希望是跨平台的,所以 posix 解决方案不会削减它。不过谢谢!
    【解决方案2】:

    标准库中没有任何东西可以做到这一点。除非您的平台为更新时区的库提供了一些扩展,否则您的程序对localtime() 的调用可能总是使用程序启动时处于活动状态的时区。

    您可以通过将localtime 内容放在一个单独的进程中来解决这个问题,您的主程序可以随意启动和关闭,从而重新初始化该进程的时区。

    或者,您的平台可能会提供一些其他 API 来获取反映系统时区变化的本地时间。

    【讨论】:

    • 我担心(或者希望!)它会是这样的。我们有希望以后跨平台,所以 Posix 解决方案不好。必须提供“如果您更改时区,重新启动服务”解决方案的文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2018-10-14
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    相关资源
    最近更新 更多