gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:26:09 24 4
gpt4 key购买 nike

我试图以秒为单位找出两个日期之间的差异。

我已经使用 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 时间戳从 1/1/1970 开始,所以当您显示时间戳时,我首先想到的是 1/1/1900 应该是负数。如果我们分析您使用的日期的确切 UNIX 时间戳,它应该是 -2208988800(对于 1/1/1900 00:00:00 UTC),它更大(绝对值)比用 32 位表示的最低最小整数(二进制补码)是 -2147483648

如果你想做精确的计算,你必须切换到 64 位整数,你会得到正确的结果。

  • 2000-01-01 20:38:40 -> 946759120 的 Unix 时间戳
  • 1900-01-01 00:00:00 -> -2208988800 的 Unix 时间戳
  • 两者的区别:946759120 - (-2208988800) = 3155747920 s。

你得到的时间戳是溢出结果的低32位。 32 位时间戳的二进制补码可能的最小日期是 -2147483648 -> 13/Dec/1901, 20:45:52

关于c - 使用 mktime() 查找两个日期之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41217233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com