【问题标题】:How to known which time zone the system is using如何知道系统正在使用哪个时区
【发布时间】:2016-11-10 11:50:25
【问题描述】:

我正在编写一些代码,我需要知道系统中哪个时区处于活动状态(我正在使用 Linux SO):

  • 我的第一个方法是检查 TZ 环境变量,除非我设置它(例如调用 tzset),否则它是空的

  • 之后我尝试extern long timezone (time.h) 但此变量始终为 0。

  • 最后我计算了我的时区和 UTC+0 的差异,但我没有得到我的真实时区,因为我不知道夏令时是否适用

我很确定有一种简单(且最一致)的方法可以实现这一目标。我正在寻找类似“Europe/Paris”或“UTC+2”之类的东西

任何帮助将不胜感激!

【问题讨论】:

标签: c linux timezone


【解决方案1】:

作为一个起点,我建议这样做:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
  char str[64];
  time_t timer;
  struct tm * ptm;
  timer = time(NULL);
  ptm = localtime(&timer); 
  strftime(str, sizeof(str), "%Z", ptm);
  printf("TZ: %s\n", str);
  return(0);
}

【讨论】:

  • 我不认为sizeof(str-1) 做你认为它做的事。
  • 这几乎是我想要的!,我得到了巴黎的“CET”、纽约的 EST 和哥斯达黎加的 CST。
  • 不需要负1。 strftime(str, sizeof str , "%Z", ptm); 没问题。最好检查它的返回值。
  • @JoanEsteban 这个答案怎么不是你想要的?如果结果是"CET",则that 是代码所理解的时区名称。名字是not"Europe/Paris"。在另一个系统上,代码可能会返回"Europe/Paris",因为这是该系统上的名称。您是如何将系统设置为“巴黎”的?也许这就是缺点?
  • @琼。如果您想更进一步,您需要使用位于 /usr/share/zoneinfo 中的所谓的 Olson 数据库(以 Arthur David Olson 命名)。您的 /etc/localtime 应该是时区的符号链接,格式为 Asia/Tokyo,例如在 Olson 数据库中。通过一些系统调用,您应该可以轻松地跟踪它。这不适用于有限的嵌入式 Linux 系统,其中 TZ 仍以压缩形式使用,称为 POSIX TZ 字符串(如 EST5EDT,M03.2.0,M11.1.0)
【解决方案2】:

选项 1)

timezone 和 tzname 在调用 tzset() 后可用:

cout << "Before tzset: " << timezone << " " << tzname[0] << " " << tzname[1] << endl;
tzset();
cout << "After tzset: " << timezone << " " << tzname[0] << " " << tzname[1] << endl;

输出(今天,在欧洲):

Before tzset: 0 GMT GMT
After tzset: -3600 CET CEST

选项 2) 某些版本的“struct tm”(GNU、BSD、...)包含字段“tm_zone”和“tm_isdst”:

time_t timer;
struct tm *ptm;

timer = time(NULL);
ptm = localtime( &timer );
cout << ptm->tm_zone <<  " " << ptm->tm_isdst << endl;

timer -= 60*24*3600; // 60 days ago
ptm = localtime( &timer );
cout << ptm->tm_zone <<  " " << ptm->tm_isdst << endl;

输出:

CET 0
CEST 1

【讨论】:

    【解决方案3】:

    date +%Z 命令显示当前时区,但您真正想要的是正确设置它。首先删除当前时区文件:

    # rm -f /etc/localtime
    

    然后为您的时区设置正确的:

    # ln -s /usr/share/zoneinfo/<your-time-zone-here> /etc/localtime
    

    发送ls /usr/share/zoneinfo/ 以查看可用时区。对我来说是/usr/share/zoneinfo/Europe/Amsterdam

    然后使用上述date 命令进行验证。

    【讨论】:

    • 这不是我要的,我已经用几个时区检查我的代码,但我想从 C 程序中获取我的时区(当然,我可以' t 阅读 /etc/localtime 链接,因为它并不总是链接)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    相关资源
    最近更新 更多