使用 C 使用 strftime() 获取缩写时区

Getting Abbreviated timezone using strftime() using C

我在 SO 上查看了 this, and this,但它们处理的是同一问题的非 C 变体。

使用 GNU GCC 编译器(Code::Blocks,在 Windows 中)和以下代码:

int main(void)
{
    time_t rawtime;
    struct tm *info;
    char timeStr[80];

    time( &rawtime );
    info = localtime( &rawtime );

    strftime(timeStr,80,"%a %b %d %H:%M:%S %Z %Y", info);

    printf("%s", timeStr);
    getchar();

    return 0;
} 

我正在获取这个时间字符串:

Tue Aug 30 14:55:08 Pacific Daylight Time 2016

除了时区,一切都很好。我更喜欢缩写,例如:

Tue Aug 30 14:55:08 PDT 2016

strftime() 的每个手册页或 windows 文档中,我可以找到格式说明符 %Z 的描述如下:时区名称 或缩写。 ( eg. here. )

格式化时区要缩写的技巧是什么?

strftime 不保证您会得到全名或缩写。它取决于实现。 C99 规范 (and Microsoft's documentation) 说:

%Z is replaced by the locale’s time zone name or abbreviation, or by no characters if no time zone is determinable.

据我所知,没有标准的 C 方法可以保证您将获得时区缩写。假设您使用系统时区数据库。你可以 ship with your own copy of the time zone database.

一般来说,时区缩写不是一个好主意,因为它们有歧义。略读 the list 我们发现 ACT、AMT、BST、ECT、GST、IST、LHST、MST、PST 和 SST 都是模棱两可的。您最好使用全名、数字偏移量(即 %z),或者完全避开时区并使用 UTC(对日志记录特别有用)。

我最近也需要同样的东西,确定没有好的答案。我写了一些暴力代码来映射 Windows 时区字符串,例如 "Eastern Standard Time" 到 "EST",但我知道 (a) 这是一个坏主意,并且 (b) 我的翻译列表会永远不完整。