免费注册 查看新帖 |

Chinaunix

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

一个比较有意思的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-04 17:37 |只看该作者 |倒序浏览
我在SCO5.0.5下写了如下代码:
#include <stdio.h>;
#include <time.h>;

void main()
{
        time_t lt;
        struct tm *today;

        time(&lt);
        today = localtime(&lt);
        printf("today is: %04d-%02d-%02d\n", today->;tm_year + 1900, today->;tm_mon + 1, today->;tm_mday);
        today->;tm_mday -= 365;
        lt = mktime(today);
        memset(today, 0, sizeof(struct tm));
        today = localtime(&lt);
        printf("last day is: %04d-%02d-%02d\n", today->;tm_year + 1900, today->;tm_mon + 1, today->;tm_mday);
}

运行的结果如下:
today is: 2004-02-04
last day is: 2003-02-11

但同样的源代码在windows下用VC编译运行结果如下:
today is: 2004-02-04
last day is: 2003-02-04

百思不得其解?!!

论坛徽章:
0
2 [报告]
发表于 2004-02-04 17:47 |只看该作者

一个比较有意思的问题

today->;tm_mday -= 365; 能这样做吗?
你要干什么呀??

论坛徽章:
0
3 [报告]
发表于 2004-02-04 18:01 |只看该作者

一个比较有意思的问题

有这样的用法?
time(<;  

论坛徽章:
0
4 [报告]
发表于 2004-02-04 18:43 |只看该作者

一个比较有意思的问题

你time的参数被转义了,能不能用code贴出来?

论坛徽章:
0
5 [报告]
发表于 2004-02-05 08:01 |只看该作者

一个比较有意思的问题

我这段代码是取去年同期日期中的一小段!但不知为何在SCO5.0.5下运行不正常,不知大家有没有类似经历!

  1. #include <stdio.h>;
  2. #include <time.h>;

  3. void main()
  4. {
  5.         time_t lt;
  6.         struct tm *today;

  7.         time(&lt);
  8.         today = localtime(&lt);
  9.         printf("today is: %04d-%02d-%02d\n", today->;tm_year + 1900, today->;tm_mon + 1, today->;tm_mday);
  10.         today->;tm_mday -= 365;
  11.         lt = mktime(today);
  12.         memset(today, 0, sizeof(struct tm));
  13.         today = localtime(&lt);
  14.         printf("last day is: %04d-%02d-%02d\n", today->;tm_year + 1900, today->;tm_mon + 1, today->;tm_mday);
  15. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2004-02-05 11:36 |只看该作者

一个比较有意思的问题


既然是取去年的同段日期,直接这么做:
  1. today->;tm_year -= 1;
复制代码


用mday来减,一年不一定是365天啊。

大概windows提供了从日期加减的正确的进/退位功能吧。

论坛徽章:
0
7 [报告]
发表于 2004-02-05 18:18 |只看该作者

一个比较有意思的问题

我在sco下面试了,没有问题呀!看代码也没看出什么问题。你今天再次运行还是这样吗?

论坛徽章:
0
8 [报告]
发表于 2004-02-06 11:39 |只看该作者

一个比较有意思的问题

在回答这个问题前,先说一点题外话:简单就是美。
Unix在制定时间的标准上很简单,那就是以EPOCH为时间起点,秒的增加数为"Unix原始日历时间",这样就可以统一系统时间,不用考虑国际日期变更线之类的问题,它是UNIX处理时间的基础,所以要得到struct tm,先lt=time(NULL),然后today=localtime(&lt)。
再看看struct tm{              {
                      int     tm_sec;         /* [0-61],60,61用于处理闰秒 */
                      int     tm_min;         /* [0-59] */
                      int     tm_hour;        /* [0-23] */
                      int     tm_mday;        /* [1-31] */
                      int     tm_mon;         /* [0-11] */
                      int     tm_year;        /* The number of years since 1900 */
                      int     tm_wday;        /* [0-6] */
                      int     tm_yday;        /* [0-365] */
                      int     tm_isdst;       /* 夏令时标志位 */
              };
所以,如果强制给tm付值,可能会自相矛盾,譬如说:今天是2004-02-06星期5,强制付值tm_year=2004,tm_mon=1,tm_mday=6,tm_wday=1,则tm_wday无效。而tm_mday的取值范围是[1-31],today->;tm_mday -= 365自然会有问题。如果你一定要减N天,当然应该用lt=lt-N*24*60*60,再localtime。至于LINUX,WIN都正确,是因为修改了该BUG,正如黑客帝国所说的,有些规则你必须遵守,有些规则你不必遵守,前提是你知道怎么去修改localtime的BUG。

写在后面的话:
很感谢CU为我们提供了这么一个好的相互交流学习的平台,我很珍惜,我也希望其他的朋友也能珍惜,不要象在其他论坛上那样乱灌水!光看不回,也不会挨什么板砖。但如果你知道该问题的解决方法,还请贴出来共享。

论坛徽章:
0
9 [报告]
发表于 2004-02-08 00:04 |只看该作者

一个比较有意思的问题

呵呵,我倒不是为了灌水才在CU混的,只是鼓励大家互相帮助而已。
楼上说“至于LINUX,WIN都正确,是因为修改了该BUG”,那么楼主用sco505就是有BUG喽?我不解的是,我用的系统和楼主的一样,为何我的运行结果是正确的?难道这种错误会随机产生吗?可是既然tm_mday的取值在1-31,那么应该是每次都必然错才对呀?这作何解释?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP