我试图在几秒钟内找到两个日期之间的差异。
我使用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秒
为什么两种方法的结果都有差异?会有什么不同?我需要处理时区吗?
答案 0 :(得分:0)
给定日期的unix时间戳从1970年1月1日开始,所以当你显示你的时间戳时,首先击中我的是1/1/1900应该是负数。如果我们分析您使用的日期的确切UNIX时间戳,它应该是-2208988800
(对于1/1/1900 00:00:00 UTC
),它比32位中可表示的最小最小整数(绝对值)更大(以二进制补码表示) )-2147483648
。
如果你想进行精确的计算,你必须切换到64位整数,你才能得到正确的结果。
2000-01-01 20:38:40 -> 946759120
1900-01-01 00:00:00 -> -2208988800
946759120 - (-2208988800) = 3155747920 s.
您获得的时间戳是溢出结果的32个最不重要的位。 32位时间戳以二进制补码表示的最小日期为-2147483648 -> 13/Dec/1901, 20:45:52
。