【问题标题】:Getting Abbreviated timezone using strftime() using C使用 C 使用 strftime() 获取缩写时区
【发布时间】:2017-01-07 08:27:22
【问题描述】:

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

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

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;
} 

我得到了这个时间字符串:

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

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

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

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

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

【问题讨论】:

  • “格林威治标准时间”的缩写,即“GMT”,但我们从未见过“GMTDT”。
  • 您是否查看过微软对其strftime() 的评价?您的编译器是否配置为使用 Microsoft C 运行时库或其他一些 C 运行时库进行构建?
  • @WeatherVane - 大声笑,说得好。我看到时间戳来自我正在使用的设备,该设备使用的是类似 Linux 的操作系统,它有一个缩写的时区。也许它是特定于实现的?
  • @WeatherVane 事实上,在英国的夏季,Windows 机器会显示字符串“GMT Daylight Time”(这也是%Z 的值将扩展为)。跨度>

标签: c windows strftime


【解决方案1】:

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

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

AFAIK 没有标准的 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(对日志记录特别有用)。

【讨论】:

  • "AFAIK 没有标准的 C 方法来保证您将获得时区缩写"。这是正确的。在 Windows 下你会得到全名,在 Unix 和 Linux 以及其他基于 Arthur David Olson 时区代码(包括 MacOS)的系统下你会得到缩写,而且没有办法要求其中之一。
  • @SteveSummit - 我会在答案中点击它。它通过关于 strftime() 的时区行为的清晰明确的陈述增加了对话(和我的理解)。谢谢。
【解决方案2】:

我最近需要同样的东西,并确定没有好的答案。我编写了一些蛮力代码来将 Windows 时区字符串(如“东部标准时间”)映射到“EST”,但我知道 (a) 这是一个坏主意,并且 (b) 我的翻译列表永远不会完整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2014-11-16
    • 2013-11-26
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多