2038年问题



2038年问题

 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作。所有使用UNIX时间表示时间的程序都将受其影响,因为它们以自1970年1月1日经过的秒数(忽略闰秒)来表示时间。这种时间表示法在类Unix(Unix-like)操作系统上是一个标准,并会影响以其C编程语言开发给其他大部份操作系统使用的软件。

在大部份的32位操作系统上,此“time_t”数据模式使用一个有正负号的32位元整数(signedint32)存储计算的秒数。也就是说最大可以计数的秒数为 2^31次方 可以算得:

2^31/3600/24/365 ≈ 68年

所以依照此“time_t”标准,在此格式能被表示的最后时间是2038年1月19日03:14:07,星期二(UTC)。超过此一瞬间,时间将会被掩盖(wrap around)且在内部被表示为一个负数,并造成程序无法工作,因为它们无法将此时间识别为2038年,而可能会依个别实作而跳回1970年或1901年。

对于PC机来说,时间开始于1980年1月1日,并以无正负符号的32位整数的形式按秒递增,这与UNIX时间非常类似。可以算得:

2^32/3600/24/365 ≈ 136年

到2116年,这个整数将溢出。

Windows NT使用64位整数来计时。但是,它使用100纳秒作为增量单位,且时间开始于1601年1月1日,所以NT将遇到2184年问题。

苹果公司声明,Mac在29,940年之前不会出现时间问题!

时间: 2024-11-05 13:25:51

2038年问题的相关文章

时间戳(UnixTimestamp)与 《2038年问题》

时间戳是从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. 现在时间戳的长度是十位(1435113975--2015/6/24 10:46:15). 要到 2286/11/21 01:46:40 才会变成11位(10000000000),距离现在还有 271年. 不同时区获取的时间不一样,生成的时间戳会不一样,比如中国是东八区(+8),美国东部是西五区(-5),两地的时差是13小时,北京比纽约要早13个小时: 一般从中国的

洛谷 P2655 2038年问题

P2655 2038年问题 题目描述 网络时代,机会与危机共存.“千年虫”解决之后,会不会有新的“虫”出现?回答是肯定的,“2038年”就是一个新的关卡. 也许大家都已经知道计算机的2000年问题是什么概念,但是什么时候又冒出来一个2038年问题的呢? 用C语言编制的程序不会碰到2000年问题,但是会有2038年问题.这是因为,大多数C语言程序都使用到一个叫做“标准时间库”的程序库,这个时间库用一个标准的4字节也就是32位的形式来储存时间信息. 当初设计的时候,这个4字节的时间格式把1970年1

“千年虫问题”、“2038年问题”、什么是闰年

(1)先温习一下什么是闰年(Leap Year) 闰年是公历中的名词.闰年分为普通闰年和世纪闰年. 普通闰年:能被4整除但不能被100整除的年份为普通闰年.(如2004年就是闰年,1999年不是闰年); 世纪闰年:能被400整除的为世纪闰年.(如2000年是世纪闰年,1900年不是世纪闰年); 闰年(Leap Year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的.补上时间差的年份为闰年.闰年共有366天(1-12月分别为31天,29天,31天,30天,31天,30天

php 2038年问题

在mysql中存放日期时可以存放整数 (int),  而int可以存放的数据最大为4294967295(无符号), 而php最大为2147483647, 要显示一个大于2038年日期,该如何处理 ? 1.更换平台,换成64位系统. 2.使用datetime类 <?php $date = new DateTime('@2444486400'); //设置中国时间 $date->setTimezone(new DateTimezone('PRC')); echo $date->format(

Java 获取 Unix时间戳

unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒. 在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题. 但是,因为需求是需要int类型的UNIX时间戳. 开始的时候我是这样设计的. /** * 获取当前事件Unxi 时间戳 * @return */ public static int getUnixTimeStamp(){ long rest=System.currentTimeMillis()/1000L; return (i

MySQL中日期和时间类型

1 日期类型 MySql中关于日期的类型有Date/Datetime/Timestamp三种类型. 日期赋值时,允许"不严格"语法:任何标点符都可以用做日期部分或时间部分之间的间割符.例如,'98-12-31 11:30:45'.'98.12.31 11+30+45'.'98/12/31 11*30*45'和'[email protected]@31 11^30^45'是等价的,对于不合法的将会转换为:0000-00-00 00:00:00 1.1 Date格式 此类型的字段,存储数据

Mysql中的基础函数

时间函数 select curdate();    返回2014-09-12,不包含时分秒 select curtime();    返回14:13:22,不包含年月日 select now();        返回2014-09-12 10:46:17 select unix_timestamp(now());    unix_timestamp(date)返回date的UNIX时间戳 select unix_timestamp('2013-09-01'); Unix时间戳是1970-01-0

【转】将 Linux 应用程序移植到 64 位系统上

原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软件已经变得比以前更为重要.在本文中,您将学习如何在进行语句声明.赋值.位移.类型转换.字符串格式化以及更多操作时,防止出现可移植性缺陷. 0 评论: Harsha S. Adiga, 软件工程师, IBM 2006 年 5 月 18 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个

关于1970-1-1 00:00.000的知识【转】

转自:http://blog.csdn.net/tianzizhi/article/details/4547373 现在计算机和一些电子设备时间的计算和显示是以距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量为标准的,如1970-1-10 20:47 偏移量为2724441632毫秒,出现类似字样说明时间被初始化了. 小知识:格林威治标准时间GMT许多人都知道两地时间表简称为GMT或UTC,而世界时区表则通称为World Time,那么G