【问题标题】:How do I set TZ env var to CET in visual C?如何在 Visual C 中将 TZ env var 设置为 CET?
【发布时间】:2013-06-29 03:47:51
【问题描述】:

这是我的代码:

#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”:它将时区设置为零。
支持的值列表在哪里?
看来我用的名字在visual C中无关紧要,重要的是后面的数字,例如“FOO-1”。

【问题讨论】:

    标签: visual-c++ timezone


    【解决方案1】:

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

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

    在 MS Visual C++ 中,以下几点尤其突出:

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

    还有更麻烦的:

    TZ 是 Microsoft 扩展,不是 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 时区那样标准化。

    【讨论】:

    • 所以,没有办法使用 crt 来定义欧洲 dst。
    • 当您尝试扩展 posix 字符串时会发生什么?
    • 什么都没有。从 "CET-1CEST,M3.5.0/2,M10.5.0/3" 它只读取 "CET-1CES"。
    • 我想知道Windows XP是如何处理俄罗斯取消夏令时的,因为DYNAMIC_TIME_ZONE_INFORMATION只出现在Vista中
    • 他们通过发布 DST 规则补丁来做到这一点。 Read here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2021-09-27
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多