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

ryy*_*ker 4 c windows strftime

我已经在 SO 上查看了thisthis,但它们处理的是同一问题的非 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;
} 
Run Code Online (Sandbox Code Playgroud)

我得到这个时间字符串:

2016 年 8 月 30 日星期二 14:55:08 太平洋夏令时

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

2016 年 8 月 30 日星期二 14:55:08 PDT

strftime() 的每个手册页或 Windows 文档中,我都可以找到格式说明符 %Z 的描述,例如: Timezone name or abbreviation。(例如。这里。)

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

Sch*_*ern 5

strftime不保证您会得到全名还是缩写。它依赖于实现。C99 规范(和微软的文档)说:

%Z 替换为区域设置的时区名称或缩写,如果无法确定时区,则替换为无字符。

AFAIK 没有标准的 C 方法来保证你会得到时区缩写。假设您使用系统时区数据库。您可以随附您自己的时区数据库副本

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