为什么gettimeofday时区错了?

时间:2017-11-10 03:28:25

标签: timezone posix ubuntu-16.04

对于Ubuntu 16中的当前时区,ftime和gettimeofday都返回0.在Ubuntu提供的日期和时间设置中正确设置了时区。没有TZ env变量集。

我不想只是“修复”它,因为这是在许多不同环境中使用的生产软件。所以我只想要一种可靠的方式来以编程方式获取时区(最好是当前的DST偏移量)。

到目前为止我的尝试:

#if 0
timeb tbTime;
ftime(&tbTime);
int CurTz = -tbTime.timezone;
#else
struct timeval tv;
struct timezone tz;
int r = gettimeofday(&tv, &tz);
if (r)
    return NO_ZONE;

int CurTz = tz.tz_minuteswest;
#endif

'date'命令正在运行:

matthew@mallen-ubuntu:~$ date +%Z
AEDT
matthew@mallen-ubuntu:~$ date +%z
+1100

我可以生成一个调用“date”的进程,但是当某些API调用可用时,这似乎非常繁重。

1 个答案:

答案 0 :(得分:1)

在GNU / Linux上,gettimeofday的第二个参数非常无用,应始终为NULLmanual page for gettimeofday说明了这一点:

  

时区结构的使用已经过时;通常应将tz参数指定为NULL。

即使在非Linux系统上,tz_dsttime也有无用的语义(例如,它报告说印度使用DST,因为它在大约七十年前的短暂时间内这样做了。)

如果您需要获取当前时间的时区,则需要使用localtimelocaltime_r并检查它产生的故障时间结构(而不​​是全局变量,例如{{} 1}})。您可能感兴趣的daylight成员是struct tmtm_isdst,也许是tm_gmtoff。后两者是glibc扩展。