【问题标题】:_tzset and x letter time-zone names_tzset 和 x 字母时区名称
【发布时间】:2026-02-03 07:45:02
【问题描述】:

如何在 C 中使用这种格式设置圣皮埃尔和密克隆 (PMST3PMDT) 的时区:

set TZ=tzn[+ | –]hh[:mm[:ss] ][dzn]

如果您查看_tzset 的文档,您可以阅读:

zn

三个字母的时区名称,例如 PST。您必须指定从本地时间到 UTC 的正确偏移量。

4 个字母 (PMDT) 或 5 个字母 (EASST) 的时区名称呢? 以下是所有时区缩写的列表:wikiepedia

这是我用 C 语言测试 _tzset 的简单代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/timeb.h>
#include <time.h>
//add _CRT_SECURE_NO_WARNINGS in the project properties "preprocessor definitions"

int main(int argc, char* argv[])
{
    time_t t;
    struct tm * now;

    _putenv("TZ=PST8PDT"); // for pacific standard time, there is no problem
     _tzset();

    t = time(0);
    now = localtime( & t );
    printf("time: %d:%d \nisdst:%d\n", now->tm_hour, now->tm_min, now->tm_isdst);
    printf("_daylight=%d\n", _daylight);
    printf( "_timezone=%d\n", _timezone);
    printf( "_tzname[0]=%s\n", _tzname[0]);
    printf( "_tzname[1]=%s\n", _tzname[1]);

    return 0;
}

*我使用的是windows8,visual studio 2012

【问题讨论】:

  • 只有在 Windows 上,标准函数才能获取 _ 前缀。 POSIX 说 std 和 dst 指示不少于三个,不超过 {TZNAME_MAX} 字节,它们是标准 (std) 或替代 (dst - 例如夏令时) 时区的指定。只需要std;如果缺少 dst,则替代时间不适用于此语言环境。 POSIX 还要求 TZNAME_MAX 至少为 6 (&lt;limits.h&gt;)。如果微软在这个问题上不遵守(当前版本的)POSIX,你可能不得不与他们一起解决这个问题——以及最好的英国人!
  • 感谢您的留言。我在Microsoft forum 上发布了同样的问题,但我想我永远不会有答案

标签: c timezone


【解决方案1】:

根据我在 Ubuntu 上的时区数据库中看到的:

/usr/share/zoneinfo/zone.tab

您要使用的时区名为America/Miquelon

所以你会想要这样做:

setenv("TZ", "America/Miquelon", 1);
tzset();

强制时区为圣皮埃尔和密克隆。

我不知道这是否可以在 MS-Windows 下工作...

【讨论】: