【发布时间】:2012-02-08 02:20:03
【问题描述】:
我有一个使用 localtime() 的设置来获取一个带有本地时间的 tm。这一切都很好。
但是,如果我在应用程序运行时更改时区,它不会注意到我已更改时区。
有没有办法告诉它“再看一遍”以刷新到系统时区?
我知道这可能不是一个常见的情况,但这是测试正在做的测试这个功能,所以他们希望它得到支持!
【问题讨论】:
我有一个使用 localtime() 的设置来获取一个带有本地时间的 tm。这一切都很好。
但是,如果我在应用程序运行时更改时区,它不会注意到我已更改时区。
有没有办法告诉它“再看一遍”以刷新到系统时区?
我知道这可能不是一个常见的情况,但这是测试正在做的测试这个功能,所以他们希望它得到支持!
【问题讨论】:
看看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
【讨论】:
标准库中没有任何东西可以做到这一点。除非您的平台为更新时区的库提供了一些扩展,否则您的程序对localtime() 的调用可能总是使用程序启动时处于活动状态的时区。
您可以通过将localtime 内容放在一个单独的进程中来解决这个问题,您的主程序可以随意启动和关闭,从而重新初始化该进程的时区。
或者,您的平台可能会提供一些其他 API 来获取反映系统时区变化的本地时间。
【讨论】: