[英]Finding difference between two dates using mktime()
我试图找到秒之间的两个日期之间的差异。
我用过tm1和tm2来存储两个不同的日期。
tm1 = 1900-01-01 00:00:00
tm2 = 2000-01-01 20:38:40
tm1.tm_year = 0
tm1.tm_mon = 0
tm1.tm_mday = 1
tm2.tm_year = 100
tm2.tm_mon = 0
tm2.tm_mday = 1
tm2.tm_hour = 20
tm2.tm_min = 38
tm2.tm_sec = 40
现在到代码:
time_t t1, t2;
t1=mktime(&tm1);
t2=mktime(&tm2);
int diff = difftime(t2,t1);
在这种情况下, t1
的实际值为2209010000
, t2
的实际值为946739320
。
现在,我使用PostgreSQL执行了类似的功能:
select EXTRACT(EPOCH FROM ('2000-01-01 20:38:40' - CAST('1900-01-01' AS TIMESTAMP)));
但是从结果difftime()
函数是3155749320
,并通过查询结果是3155747920
,1400秒的差异。
为什么两种方法的结果都不同? 是什么造成了差异? 我需要处理时区吗?
给定日期的unix时间戳记始于1970年1月1日,因此,当您显示时间戳记时,我遇到的第一件事是1/1/1900应该为负数。 如果我们分析使用日期的确切UNIX时间戳,则它应为-2208988800
(对于1/1/1900 00:00:00 UTC
),该值(以绝对值计)大于32位可表示的最低最小整数(以2的补码表示),即-2147483648
。
如果要进行精确的计算,则必须切换到64位整数,您将获得正确的结果。
2000-01-01 20:38:40 -> 946759120
Unix时间戳 1900-01-01 00:00:00 -> -2208988800
Unix时间戳1900-01-01 00:00:00 -> -2208988800
946759120 - (-2208988800) = 3155747920 s.
您获得的时间戳是溢出结果的32个最低有效位。 二进制补码的32位时间戳可能的最小日期为-2147483648 -> 13/Dec/1901, 20:45:52
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.