繁体   English   中英

使用mktime()查找两个日期之间的差异

[英]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的实际值为2209010000t2的实际值为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM