免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3165 | 回复: 3
打印 上一主题 下一主题

Linux time问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-29 09:50 |只看该作者 |倒序浏览
string dateTimeStr = "2038-12-31 23:59:59";               string formaterStr = "%Y-%m-%d %H:%M:%S";

               int year,month,day,hour,minutes,secondsPar;
        sscanf(dateTimeStr.c_str(),formaterStr.c_str(),&year,&month,&day,&hour,&minutes,&secondsPar);  
   
        if(year <1900) year = 1970;
        if(month <0) month = 1;
        if(day <0) day = 1;
        if(hour <0) hour = 0;
        if(minutes <0) minutes = 0;
        if(secondsPar <0) secondsPar = 0;
        tm t;
        t.tm_year = year-1900;
               cout<<"year"<<year-1900<<endl;        
        t.tm_mon = month-1;
        t.tm_mday = day;
        t.tm_hour = hour+1;
        t.tm_min = minutes;
        t.tm_sec = secondsPar;
        time_t  seconds = mktime(&t);
                cout<<"seconds"<<seconds<<endl;
                tm date = *localtime(&seconds);
        char *datetime;
        datetime = asctime(&date);
        cout<<datetime<<endl;


==============================
问题: 当dateTimeStr = "2037-12-31 23:59:59";
           year137
           seconds2145887999
           Thu Dec 31 23:59:59 2037
         
================================================================
           当dateTimeStr = "2038-12-31 23:59:59";  
           year138
           seconds-1
           Thu Jan  1 07:59:59 1970
        

是不是超出范围了,有什么解决方法吗?

论坛徽章:
0
2 [报告]
发表于 2010-06-29 12:25 |只看该作者
2038年有一个坎。

论坛徽章:
0
3 [报告]
发表于 2010-06-29 13:19 |只看该作者
http://zh.wikipedia.org/zh/2038%E5%B9%B4%E9%97%AE%E9%A2%98

在计算机应用上,2038年问题可能会导致某些软件在2038年1 月19日3时14分07秒之后无法正常工作。所有使用POSIX时间表示时间的程序都将受其影响,因为它们以自1970年1 月1日经过的秒数(忽略闰秒)来表示时间。这种时间表示法在类Unix(Unix-like)操作系统上是一个标准,并会影响以其C编程语言开发给其他大部份操作系统使用的软件。在大部份的32位操作系统上,此「time_t」数据模式使用一个有正負號的32位元整數(signed int32)存储计算的秒数。依照此「time_t」标准,在此格式能被表示的最后时间是2038年1月19日03:14:07,星期二(UTC)。超过此一瞬间,时间将会被掩盖(wrap around)且在内部被表示为一个负数,并造成程序无法工作,因为它们无法将此时间识别为2038年,而可能会依個別實作而跳回1970年或1901年。错误的计算及动作可能因此产生。

目前并没有针对现有的CPU/操作系统搭配的简单解决方案。直接将POSIX时间更改为64位模式将会破坏对于软件、数据存储以及所有与二进制表示时间相关的部份的二进位兼容性。更改成无符号的32位整数则会影响许多与两时间之差相关的程序。

大部份64位操作系统已经把time_t這個系統變數改為64位寬。不過,其他現有架構的改動仍在進行中,不過預期「應該可以在2038年前完成」。然而,直到2006年,仍然有数以亿計的32位系统在運行中,特別是许多嵌入式系统。相对于一般电脑科技18至24个月的革命性更新,嵌入式系统可能直至使用寿命终结都不会改变。32位 time_t的使用亦被编码于文件格式,例如众所周知的ZIP压缩格式。其能存在的时间远比受影响的机器长。

新的64位运算器可以记录至约2900亿年后的292,277,026,596年12月4日15:30:08,星期日(UTC)。

论坛徽章:
0
4 [报告]
发表于 2010-06-29 13:53 |只看该作者
学习了,以前还真没注意到这个问题,没想到竟然有这么大一个问题潜伏在这里。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP