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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
我的算法学习之路【原来还是那个大神写的 继续膜拜】
这篇文章讲了什么? 我这些年学习数据结构和算法的总结。 一些不错的算法书籍和教程。 算法的重要性。 初学 第一次接触数据结构是在大二下学期的数据结构课程。然而这门课程并没有让我入门——当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾——反正最后考试划个重点也能过,于是这门整个计算机专业本科最重要的课程就被傻逼的我直接忽略过去了。 直到大三我才反应过来以
关于C和C++一些大神们的讨论
知乎上曾经有一个关于C和C++语言的讨论,弄的沸沸扬扬。余天升 开源社区一直都不怎么待见C++,自由软件基金会创始人Richard Stallman认为C++有语法歧义,这样子没有必要、非常琐碎还会和C不兼容,并且还带来不了什么非常大的好处。 having ambiguous grammar and “gratuitous, trivial, incompatibilities with C (
有问题的懒加载,框架还可以使用
有问题的懒加载,有大神帮忙修改么?
有wordpress大神么
1、负责公司全球建站SaaS平台开发; 2、负责新垂直行业网站技术框架开发。 任职要求: 1、2年以上 Wordpress 开发经验和独立建站能力 或PHP 开发经验; 2、精通基于Wordpress 的外贸网站开发(包括主题开发和修改、插件开发和修改等); 3、掌握相关 Web 前端技术,熟练掌握 div+css、JavaScript、JQuery、HTML5、CS
C时间函数集 C时间函数集
C时间函数集C时间函数集 C时间函数集C时间函数集 C时间函数集C时间函数集 C时间函数集C时间函数集
c/c++下时间函数总结
    1、time_t time(time_t * timer);time()函数通过返回值或参数获得本机的当前日历时间(从1970年1月1日0时0分0秒到现在经过的秒数),time_t实际上是一个long long。linux下time_t是int,这样会引发2038年问题。    2、struct tm * gmtime(const time_t *timer);          stru...
c语言编程的时间函数详解
asctime(将时间和日期以字符串格式表示); ===>传入UTC(struct tm)tmp,返回char*。 ctime(将时间和日期以字符串格式表示); ===>传入(time_t)arg,返回char*。 gettimeofday(取得目前的时间); ===>传入(time_t)arg,返回tv,tz结构体传入时间,时区信息。 gmtime(取得目前时间和日期); ===>传入(t
ANSI C 和 POSIX介绍
标准 (ANSI C, POSIX, SVID, XPG, ...) ANSI C:这一标准是 ANSI(美国国家标准局)于 1989 年制定的 C 语言标准。 后来被 ISO(国际标准化组织)接受为标准,因此也称为 ISO C。 ANSI C 的目标是为各种操作系统上的 C 程序提供可移植性保证,而不仅仅限于 UNIX。 该标准不仅定义了 C 编程语言的语发和语义,而且还定义了一个标准库
iOS大神博客汇总
王巍:http://www.onevcat.com/page/2/#blog 破船之家:http://beyondvincent.com/ 池建强:http://www.cnblogs.com/chijianqiang/ 文顶顶播客:http://www.cnblogs.com/wendingding/p/3771047.html 里脊串的博客:http://adad184.com/201
我是一个线程(对理解多线程很有帮助)
第一回 初生牛犊 我是一个线程,我一出生就被编了个号:0x3704,然后被领到一个昏暗的屋子里,在这里我发现了很多和我一模一样的同伴。 我身边的同伴0x6900 待的时间比较长,他带着沧桑的口气对我说:“我们线程的宿命就是处理包裹。把包裹处理完以后还得马上回到这里,否则可能永远回不来了。” 我一脸懵懂,“包裹,什么包裹?” “不要着急,马上你就会明白了,我们这里是不养闲