2 u013867747 u013867747 于 2016.01.14 21:05 提问

标C的时间函数还是有点不理解,有大神么?

小菜鸟今天刚学了标C的时间函数,好多结论都是网上看的,不知道哪里出问题了。

【结论一】
time_t =0 的时候 返回的时间其实是 1970-01-01 00:00:00 到UTC 0时区的秒数,而不是 我们北京时间UTC+8;所以gmtime比localtime 小8小时。

因此time返回的时间也比本地时间少8个小时 即少 28800秒

虽然如此,但是 localtime 是将时区考虑在内了,因此虽然传入的秒数UTC时间比本地时间少8个小时,但是转出来的时间结构体还是和本地时间相同。

【结论二】

struct tm that;

that.tm_year = 70;
that.tm_month = 0;
that.tm_mday = 1;
that.tm_hour =0;
that.tm_min = 0;
that.tm_src = 0;

printf("that=%ld",mktime(&that););

// 结果是 28800秒

// 结论

mktime() 的传出秒数 是 1970年1月1日0小时0分0秒(UTC)到  1970年1月1日0时0分0秒(北京时间)经过的秒数,因此是 8个小时,28800秒。

即mktime() 返回的时间其实是 1970-01-01 00:00:00 到本地时区,我们北京时间UTC+8的秒数

【矛盾案例三】
time_t now = time(NULL);
struct tm NOW = *localtime(&now);
time_t now2 = mktime(&NOW);

// 结果 now2的值和 now1的值相等
这和结论一,二矛盾了。
按理 mktime 的时间 比 time(NULL) 的时间应该多 8个小时啊。

1个回答

caozhy
caozhy   Ds   Rxr 2016.01.14 21:41

这个要看C标准库怎么得到时区信息了,一些环境下得不到时区信息,所以就不计算时区了。

u013867747
u013867747 说明我刚才那个理论错了。。但我不知道错在哪里。。。我系统的时区设置没问题。。和网上别人得出的结果是一样的。。就是8个小时。。。
接近 2 年之前 回复
u013867747
u013867747 回复caozhy: 不是。。我理论推出来北京时间A-UTC时间A,都换算成UTC时间相减应该是-8。。。但实际是8。。。
接近 2 年之前 回复
caozhy
caozhy 回复鱼片宝宝: 如果是-8,你需要获取下时区信息。一些情况下,默认的时区可能是-8(美国东部时间)
接近 2 年之前 回复
u013867747
u013867747 回复caozhy: 对啊。。所以我说北京时间A=UTC时间(A-8)+8啊。。反过来说北京时间A就是UTC(A-8)啊。。那不是比UTCA小么。。。但是我带入函数的时候是8而不是-8。。所以很奇怪
接近 2 年之前 回复
caozhy
caozhy 回复鱼片宝宝: 如果问题得到解决,麻烦点下我回答右边的采纳,谢谢
接近 2 年之前 回复
caozhy
caozhy 回复鱼片宝宝: 时间早就是时间大。比如现在我们是深夜了,你问问你在英国的朋友,他们在傍晚。
接近 2 年之前 回复
u013867747
u013867747 回复caozhy: 哦哦。。我没有出现这情况啊。。我就是弄不懂北京时间A比UTC时间A大的问题。。因为北京时间=UTC时间+8个小时,所以我觉得相减的时候要换算到一个时间,所以北京时间A换算成UTC时间还要减8个小时啊。。。所以我觉得北京时间A比UTC时间A来的小。。。
接近 2 年之前 回复
caozhy
caozhy 回复鱼片宝宝: 但是标准库在不同操作系统移植的时候,获取操作系统时区设置的实现不同。有时候获取不到,那么会出现明明调用localtime,但是并不是按照CST来计算的情况。
接近 2 年之前 回复
caozhy
caozhy 回复鱼片宝宝: 北京在8时区,所以比-时区的UTC早8小时。
接近 2 年之前 回复
u013867747
u013867747 = = 我的问题就是计算时区的情况下。。为什么北京时间A比UTC时间A来的大。。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!