数据结构论坛

首页 » 分类 » 定义 » 学校里学不到的C语言教程之13数字220
TUhjnbcbe - 2025/2/19 18:04:00
中科白癜风暖心公益活动 https://m.39.net/pf/a_10821046.html

今天在修改转换日期算法的时候想起:C语言里的日期表示其实是有很多的坑和相关知识的,非常的有必要和大家介绍下。这些知识由我在计算转换时用到的一个数字引起。要解答这个特殊的数字我们要先来看看计算机里的时间是怎样表示的,同时还要学习C语言里的时间是怎样表示的?这是啥意思?这是说C语言里的时间和计算机的时间表示并不完全一样...让我们来看看吧。

在我们那个年代,有一个令人恐慌的时间问题:那就是千年虫问题。原因是这样的,早期的计算机资源非常有限,象这样的时间在计算机里被省略掉了19这两个数据,而表示为70。但到了年以后,01到底是代表还是呢?这种混乱会千万很严重的后果--当时的人们认为,据说有人害怕在年这天发生世界大战而提前把自己的钱花光的...当然了我们现在都知道这并没有发生。其实在C语言里并没有年问题,不过它有一个类似的问题,那就是年问题。原因是这样的,在传统C语言里表示时间的类型其实是一个整数,其数值为自年1月1日以来的秒数。这真的是个超级糟糕的处理方式,首先它无法计算毫秒,当我们要进行更精细的计算时就无能为力了,这时候各路神仙不得不各显神通来解决,比如在网络通信的接口中一般会引入一个叫time_t的结构体,比较奇葩的是这个结构体本身也有兼容性问题,它在windows下和linux下的解释是不太一样的...好了,扯远了。回到C语言的那个秒整数上来,这个表示方式还有一个更严重的问题,那就是当时的计算机是32位的,当时间推移时,这些秒也快要用完了,这个就是C语言里类似千年虫问题的问题,它也使变成了每个程序员都要记住的数字...为什么不说是每个C语言程序员都要记住的数字呢?因为那些使用C语言的程序员把它直接应用到了各种接口中,使得其它的语言开发者不得不给出对应的转换函数--即使它们内部不是用整数来表示时间的。比如delphi里就是用的浮点数:整数部分表示日期,小数部分表示时间...java里直接给了一个类出来...对于的千年虫问题,业界的解决办法倒也简单:那就是将秒数表示的32位升级为64位...这个大家可以在比较新的vc里查看time()函数的返回值来证实。

但是无论如何,即使把32位的秒数升级为64位它也是不严谨的,所以很多系统里并没有使用它,比如微软的windows系统开发时就不是用的秒数表示法,而是一个结构体。没有这样做的还有各种网络协议,比如我们在windows里网络校准的时间,就是用的网络时间协议(NTP,networktimeprotocol)这个协议的时间表示和其他好几种网络协议的时间表示方法一样,它不是从处开始的秒数...你正打算松一口气的时候,结果它用的是年以来的秒数...所以先人们的智慧有时候并不是那么值得那个啥的,所以它也有千年虫问题,同时为了解决千年虫问题它同样有64位的升级版本。如果不升级会怎样呢?大家可以看一下windowsxp的时间调整,只能是到下图的时间,原因也和这些类似。

xp的时间有限制

网络协议的这种做法直接导致了数字也要被我们记住,因为它和C语言的秒数表示法相关的秒数就是这个。即年到年间经过的秒数。这样也有一个好处,大多数的语言有转换到C语言秒数的函数,却没有转换到网络协议秒数函数,这不要紧,直接加减少这个后再和C语言的时间秒数运算就可以了。这就是从一个普通数字变成有一定名气的数字的故事...

那么说了这么多,表示时间最好的数据结构到底是什么呢?我个人觉得应该就是用一个结构体好了,可惜的是现在的流行做法还是用一个整数来表示,比如golang下就有种表示纳秒的整数结构,而各种数据库中的数据其实有很多并不是存的数据库的时间日期格式,而是直接存的C语言秒数,所以大家在看到数据库中的日期字段是...开头的一长串数字时一定不要怀疑是数据库出错了或者以为是什么电话号码,而是因为开发它的那位小伙子直接用了C语言秒数。当然了,也许这位小伙并不知道这是C语言的秒数,因为他可能存的是javascript中的date.getTime()函数的结果......这种现象没什么好说的,就是C语言实在是太广泛太强大了,很多语言的时间内部实现直接就用了C语言的,或者那种语言的实现底层压根就是C语言本身...

好了,这就是我们今天要给大家讲的C语言的时间的故事,我们下次再见!

1
查看完整版本: 学校里学不到的C语言教程之13数字220