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

时间:2013-06-28 08:39:07

标签: visual-c++ timezone

这是我的代码:

#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 %+05d\n", str, ofsmm/60*100 + ofsmm % 60);
    return 0;
}

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

1 个答案:

答案 0 :(得分:1)

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

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

特别是,对于MS Visual C ++,以下几位是突出的:

  

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

更令人不安的是:

  

TZ是Microsoft扩展,不属于localtime的ANSI标准定义。

因此它可能不支持完整的POSIX时区扩展格式,例如this excellent writeup by IBM for AIX中描述的格式。

我真的不确定它是否支持扩展格式,你必须检查。我为中欧时间here找到了完整正确的POSIX样式TZ变量,即:

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

如果它不支持扩展程序,那么你可以做的最好的是CET-1CEST - 但最终会使用美国日光转换规则而不是欧洲日规转换规则。

您可以考虑使用Boost,因为它似乎完全支持POSIX time zones

但您可能想要做的是使用IANA/Olson标准时区数据库。此时区格式将由Europe/Paris等指定,并支持您指定区域中时区更改的完整历史记录。在library called ICU中似乎有一个C ++实现。您可以使用此格式here查看有效区域列表。

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