时间差 时区 UTC时间 time()、mktime()的问题。

YFY 2006-06-22 10:12:15

time()获取自1970年1月1日 0点0分0秒 至当前时间经历的秒数,使用了UTC时间。

mktime()函数则返回自1970年1月1日 0点0分0秒至传入参数之间经历的秒数。

问题:

1 不论设在什么时区,这2个函数返回的秒数总比实际的小28800秒,这是为何?
验证的方式:
设时区0,设时间2006.06.22 12:00:00,调用time()和mktime(),获得long型结果;
设时区1,设时间2006.06.22 12:00:00,调用time()和mktime(),获得long型结果;
设时区2,设时间2006.06.22 12:00:00,调用time()和mktime(),获得long型结果;
...
设时区8,设时间2006.06.22 12:00:00,调用time()和mktime(),获得long型结果;

直接计算 2个时间相差的秒数,可以用vb的datadiff函数,与上述计算的结果不一致。

2 time()和mktime()的返回结果与时区相关吗?

3 现在需要使用c/c++得到自1970年1月1日 0点0分0秒至现在当地时间(local time)所经历
的正确秒数,有没有其他一次性正确的函数,不需要加减或其它处理?
...全文
11161 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
YFY 2006-06-26
  • 打赏
  • 举报
回复
结贴先了,再考虑去,呵呵。
YFY 2006-06-23
  • 打赏
  • 举报
回复
2 time()和mktime()的返回结果与时区相关吗?
-------------------------------------------------------------------------------------
两者返回的都是UTC时间。如果仅仅改变时区,返回结果是不变的。

??? 这个是为什么? 我在改变了时区之后把时间都设置为相同18:00:00,但是返回值都是一样的,照按时区调整的描述看来,应该不一样的才对。
littlefish1981 2006-06-23
  • 打赏
  • 举报
回复
2 time()和mktime()的返回结果与时区相关吗?
-------------------------------------------------------------------------------------
两者返回的都是UTC时间。如果仅仅改变时区,返回结果是不变的。

3 现在需要使用c/c++得到自1970年1月1日 0点0分0秒至现在当地时间(local time)所经历
的正确秒数,有没有其他一次性正确的函数,不需要加减或其它处理?
-------------------------------------------------------------------------------------
好像没有,自己写个函数处理一下吧。
littlefish1981 2006-06-23
  • 打赏
  • 举报
回复
mktime()函数也是使用了UTC,会在转换前将本地时间和UTC之间的差值扣除。msdn上是这样描述的:

After an adjustment to UTC, _mktime32 handles dates from midnight, January 1, 1970, to 03:14:07, January 19, 2038. _mktime64 handles dates from midnight, January 1, 1970 to 23:59:59, December 31, 3000. This adjustment may cause these functions to return -1 (cast to time_t, __time32_t or __time64_t) even though the date you specify is within range. For example, if you are in Cairo, Egypt, which is two hours ahead of UTC, two hours will first be subtracted from the date you specify in timeptr; this may now put your date out of range.

28800秒 = 8小时,就是北京时区和GMT的时差。
YFY 2006-06-23
  • 打赏
  • 举报
回复
可以用vb的datadiff函数,与上述计算的结果不一致。

也可以用Excel的计算方法获取天数的差别,每天*86400秒,再加上小时的。
happytang 2006-06-23
  • 打赏
  • 举报
回复
带时区调整的还有其他函数
你可以看看
happytang 2006-06-23
  • 打赏
  • 举报
回复
2 time()和mktime()的返回结果与时区相关吗?
-------------------------------------------------------------------------------------
两者返回的都是UTC时间。如果仅仅改变时区,返回结果是不变的。

因为函数返回的时间日期都是未经时区转换,而是UTC时间。
函数本身就不经过时区调整,你调整时区时没用的,我是这么理解的。
你可以看看时间函数本身的构造。
C时间函数集 (转贴)
http://www.cublog.cn/opera/showart.php?blogid=19228&id=126346
rexking0 2006-06-23
  • 打赏
  • 举报
回复
time_t curr = time(NULL);
struct tm * p = gmtime(&curr);
time_t new = mktime(p);
new值应当就是你想要的值吧。
rexking0 2006-06-23
  • 打赏
  • 举报
回复
经过实践发现,改过时区后,时间保持一致。time产生的值确实是不一样的。我错了。
tailzhou 2006-06-23
  • 打赏
  • 举报
回复
在我机器上测试time(0)
(GMT+8)1151040098

(GMT-8)1151094142

在时间与日期设置那里,如果只改动时区,应用后,系统会自动修改时间,以适应时区。

估计楼主只改了时区;楼主你改动时区后应用设置,再修改时间到同一天的18:00:00测试一下
YFY 2006-06-22
  • 打赏
  • 举报
回复
呵呵。
你不会是在windwos下设置时区,然后验证吧, 那当然没用了...

就是在windows里设置了时区了,这些个函数用的时区不是windows里设置的?
YFY 2006-06-22
  • 打赏
  • 举报
回复
time,mktime这两函数应该跟时区没关系,它中跟当前设置的时间有关,你设置它为2006.06.22 12:00:00,它则返回从1970年1月1日 0点0分0秒 到 2006.06.22 12:00:00 经过的时间。

上述取得的时间与 实际1970年1月1日 0点0分0秒 到 2006.06.22 12:00:00相差的秒数不一致,相差28800秒。
rexking0 2006-06-22
  • 打赏
  • 举报
回复
请确保当前计算机中的时间是为正确的本地时间。用time函数应该就可以满足你的要求,不知道你所说的 “总比实际的小28800秒”是什么意思?
rexking0 2006-06-22
  • 打赏
  • 举报
回复
time,mktime这两函数应该跟时区没关系,它中跟当前设置的时间有关,你设置它为2006.06.22 12:00:00,它则返回从1970年1月1日 0点0分0秒 到 2006.06.22 12:00:00 经过的时间。
zez 2006-06-22
  • 打赏
  • 举报
回复
tzset()
localtime()

设时区0,设时间2006.06.22 12:00:00,调用time()和mktime(),获得long型结果;
你不会是在windwos下设置时区,然后验证吧, 那当然没用了...
rexking0 2006-06-22
  • 打赏
  • 举报
回复
不知你怎么得出相差这28800秒的?
YFY 2006-06-22
  • 打赏
  • 举报
回复
各位老大忙着看世界杯吗,,,

抽个时间来看看问题啊~

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧