我没有找到一个简单的方法来获得本地时间和UTC时间之间的时间偏移。
起初我打算使用tzset()
,但它不提供日光节约时间。根据手册页,如果日光节约生效,它只是一个与零相差的整数。虽然它通常是一个小时,但在某些国家可能是半个小时。
我宁愿避免计算gmtime()
和localtime()
返回的当前UTC之间的时差。
更一般的解决方案是给予指定位置和正的time_t值的信息,或者至少是局部的。
编辑1:用例是为https://github.com/chmike/timez获取正确的本地时间偏移。顺便说一句,如果你认为libc函数可以操作时间,请阅读https://rachelbythebay.com/w/2013/03/17/time/。
编辑2:到目前为止,我用分钟计算UTC时间偏移的最好和最简单的解决方案是
// Bogus: assumes DST is always one hour
tzset();
int offset = (int)(-timezone / 60 + (daylight ? 60 : 0));
字符串
问题是确定真实的日光节约时间。
编辑3:受到@trenki的回答的启发,我想出了以下解决方案。这是一个技巧,因为它欺骗mktime()
将gmtime()
的输出视为本地时间。当夏令时变化在UTC时间和本地时间之间的时间跨度时,结果是不准确的。
#include <stdio.h>
#include <time.h>
int main()
{
time_t rawtime = time(NULL);
struct tm *ptm = gmtime(&rawtime);
// Request that mktime() looksup dst in timezone database
ptm->tm_isdst = -1;
time_t gmt = mktime(ptm);
double offset = difftime(rawtime, gmt) / 60;
printf("%f\n", offset);
return 0;
}
型
6条答案
按热度按时间ddhy6vgd1#
您系统的strftime()函数支持
%z
和%Z
说明符吗?在FreeBSD上,字符串
我可以用这个来打印这个:
型
ISO C99在7.23.3.5
strftime
函数中有此内容:型
7qhs6swi2#
此C代码计算本地时间相对于UTC的偏移(以分钟为单位)。它假定DST始终偏移一小时。
字符串
它使用了gmtime和localtime,为什么你不想使用这些函数呢?
pzfprimi3#
.获取相对于UTC的本地时间偏移量?
@Serge Ballesta回答是 * 好 *.但我决定测试它并清理一些细节.注意:我只测试了我的时区,所以其他人可能会想在他们的系统和他们的时区检查这种方法.
这个答案类似于@trenki发布的答案,只是这个答案减去了
struct tm
值,而不是假设DST偏移为1小时,time_t
以秒为单位。字符串
输出量:
型
我会把这个作为一个评论,但显然下面是太大了。我不想为这个答案赢得声誉,但Imitation is the sincerest form of flattery。
wxclj1h54#
恕我直言,唯一的傻瓜和便携式的方法是使用
localtime
和gmtime
,并手动计算增量分钟,因为这两个函数存在于所有已知的系统。例如:字符串
请注意,我没有测试所有可能的极端情况,但它可能是您的需求的起点。
m2xkgtsf5#
我想对这个问题提出另一个答案,一个AFAICS也处理IDL的答案。
这个解决方案依赖于
timegm
和mktime
。在Windows上,timegm
可以作为_mkgmtime
从CRT获得,换句话说,定义一个条件宏。字符串
z9smfwbn6#
这是我的方式:
字符串
使用
struct tm
的自动本地存储的替代方案:型
tzlag
,以秒为单位,将是UTC偏移量的负数;您的时区标准时间与UTC相比的滞后:LocalST + tzlag = UTC
个如果你还想考虑“夏令时”,从
tzlag
中减去tm_isdst
,其中tm_isdst
是特定本地时间struct tm
的字段,在应用mktime
之后(或在使用localtime
获得它之后)。为什么它工作:
集合
struct tm
用于“epoch”时刻,即1970年1月1日,对应于time_t
为0。在该日期调用mktime()
将其转换为time_t
,就像它是UTC一样(因此得到0),然后从中减去UTC偏移量以产生输出time_t
。因此它产生UTC_offset的负数。