如何在visual C中将TZ env var设置为CET



这是我的代码:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
char env_TZ[] = "TZ=CET";
int main(int argc, char* argv[])
{
    time_t submissionTime = 1359120032;
    struct tm local_time;
    char str[30];
    int ofsmm;
    putenv(env_TZ);
    tzset();
    printf("%s (%s)n", tzname[0], tzname[1]);
    local_time = *localtime(&submissionTime);
    strftime(str, sizeof(str), "%Y-%m-%d %H:%M:%S", &local_time);
    ofsmm = -(int)(timezone/60) + (local_time.tm_isdst?60:0);
    printf("%s %+05dn", str, ofsmm/60*100 + ofsmm % 60);
    return 0;
}

env_TZ中应该包含什么?绝对不是"CET":它将时区设置为零
支持的值列表在哪里
在visual C中,我使用的名称似乎无关紧要,重要的是后面的数字,例如"FOO-1"。

C++中的时区处理是围绕POSIX风格的时区设计的,例如PST8PDT。这里没有预定义的列表,而是描述时区规则的格式。它们的局限性在于,它们只允许您定义当前规则。他们没有办法表达对这些规则的改变。

您可能需要参考以下文档链接:

  • tzset
  • 当地时间

特别是,以下位在MS Visual C++中脱颖而出:

如果设置了TZ环境变量,则C运行时库将采用适用于美国的规则来实现夏令时(DST)的计算。

更麻烦的是:

TZ是Microsoft的扩展,不属于ANSI标准对本地时间的定义。

因此,它可能不支持完整的POSIX时区扩展格式,比如IBMforAIX的这篇优秀文章中描述的格式。

我真的不确定它是否支持扩展格式,你必须检查一下。我在这里找到了中欧时间的完全正确的POSIX风格的TZ变量,它是:

CET-1CEST,M3.5.0/2,M10.5.0/3

如果它不支持扩展,你可以做的最好的事情就是CET-1CEST,但最终会使用美国的夏令时过渡规则,而不是欧洲的规则。

您可以考虑使用Boost,因为它似乎完全支持POSIX时区。

但您可能想使用IANA/Olson标准时区数据库。这种时区格式将由类似Europe/Paris的东西指定,并支持指定区域中时区更改的完整历史记录。在一个名为ICU的库中似乎有一个C++实现。您可以在此处查看此格式的有效区域列表。

时区在本机代码中要比在托管.Net代码中困难得多。如果有任何方法可以运行.Net代码,我强烈建议使用Noda Time,它在内部提供了完整的IANA/Olson数据库。您也可以通过.Net TimeZoneInfo类使用Windows时区,但它们不像IANA区域那样标准化。

相关内容

  • 没有找到相关文章

最新更新