【问题标题】:Why the result of 'gmtime, strftime' is different compiled with arm-linux-gnueabihf-gcc and mipsel-openwrt-linux-uclibc-gcc为什么使用 arm-linux-gnueabihf-gcc 和 mipsel-openwrt-linux-uclibc-gcc 编译的 'gmtime, strftime' 的结果不同
【发布时间】:2019-05-21 14:17:26
【问题描述】:

我使用strftime 来格式化时间。 %Z 格式化时区。但是结果是GMTarm-linux-gnueabihf-gcc编译,UTCmipsel-openwrt-linux-uclibc-gcc编译。

我不知道为什么。

time_t t = time(NULL);
char stat_timestamp[24] = {0};
strftime(stat_timestamp, sizeof stat_timestamp, "%F %T %Z", gmtime(&t));
printf("gmtime: %s\n", stat_timestamp);

arm-linux-gnueabihf-gcc编译:

gmtime: 2018-12-21 XX:XX:XX GMT

mipsel-openwrt-linux-uclibc-gcc编译:

gmtime: 2018-12-21 XX:XX:XX UTC

【问题讨论】:

  • 两个系统使用不同的时区名称。你还有什么想要的吗?我建议使用更宽的 char stat_timestamp[24] --> char stat_timestamp[100] 进行此调查,因为缓冲区不足会导致不确定的 stat_timestamp[]
  • 时区名称来自系统配置,而不是 C 库。

标签: c arm mips


【解决方案1】:

为什么 'gmtime, strftime' 的结果不同

  • 实现定义的行为。

C 不要求它在各种平台上都相同。

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

"C" 语言环境中...%Z 实现定义。 §7.26.3.5 7

请注意,UTC 类似于 GMT。另见Is GMT same as UTC?

【讨论】:

    【解决方案2】:

    正确的值实际上是GMT,这是一个时区。 UTC 不是时区(除非您将它用作UTC+0 的简写形式)但是而是一个时间标准,但人们经常错误地将UTC 用作区域。

    对于作为时区返回的实现没有真正的限制,因为标准只有这样说:

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

    当地时区和夏令时是“未指定行为”下列出的一些项目。

    【讨论】:

      猜你喜欢
      • 2019-09-14
      • 1970-01-01
      • 2016-02-08
      • 2020-12-21
      • 1970-01-01
      • 2012-02-11
      • 2021-10-01
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多