对于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调用可用时,这似乎非常繁重。
答案 0 :(得分:1)
在GNU / Linux上,gettimeofday
的第二个参数非常无用,应始终为NULL
。 manual page for gettimeofday
说明了这一点:
时区结构的使用已经过时;通常应将tz参数指定为NULL。
即使在非Linux系统上,tz_dsttime
也有无用的语义(例如,它报告说印度使用DST,因为它在大约七十年前的短暂时间内这样做了。)
如果您需要获取当前时间的时区,则需要使用localtime
或localtime_r
并检查它产生的故障时间结构(而不是全局变量,例如{{} 1}})。您可能感兴趣的daylight
成员是struct tm
,tm_isdst
,也许是tm_gmtoff
。后两者是glibc扩展。