LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1629|回复: 5

大伙看看(sys/time.h)里的一个计算时间公式?

[复制链接]
发表于 2004-8-17 21:36:50 | 显示全部楼层 |阅读模式
line71:  

  1. return(((
  2.         (unsigned long)(year/4-year/100+year/400+367*mon/12+day)+
  3.            year*365-719499
  4.         )*24+hour  /*now have hours*/
  5.         )*60+min   /*now have minutes*/
  6.         )*60+sec;   /*now have seconds */


复制代码


请教那"year/4-year/100+year/400+367*mon/12+day)+
           year*365-719499"是什么意思?
发表于 2004-8-18 11:56:40 | 显示全部楼层
难道你没有编写过计算那一年是闰年的程序吗?
看到“year/4-year/100+year/400”你就应该想到是和它相关了。
这一段程序旁边应该有注释,说明这段程序是干什么用的。但是你没有把注释贴出来,我也只是凭感觉和经验猜测了。

从整体上看,整个公式可以简化为:(((day*24+hour)*60+min)*60+sec),其中的day就是"year/4-year/100+year/400+367*mon/12+day)+year*365-719499",这样一个结构说明这是一个先把年月日转换成天数,然后再求出秒数的公式。既然要把年月日转换成天数,那就必然要考虑闰年的问题。不然这个转换公式就可以直接写成“year*365+mon*30+day",所以与
"year/4-year/100+year/400+367*mon/12+day)+year*365-719499"相比较,自己认真思考一下,自然就会明白为什么这样写了。
最后提示一下,unix系统中表示的时间是用1970年以后的秒数表示的。所以计算的天数还要减去公元1970年以前的天数,这个数就是719499。
发表于 2004-8-18 12:08:46 | 显示全部楼层
没有这么简单吧,即使是不算闰年,367*mon/12+day的话,一月1号可就是第31天了
发表于 2004-8-18 14:52:37 | 显示全部楼层
还要加上判断,不然怎么知道啊?
 楼主| 发表于 2004-8-18 22:28:42 | 显示全部楼层

>unix系统中表示的时间是用1970年以后的秒数表示的。所以计算的天数还要减去

听楼主这么一说,明白了,
我知道unix是1970年左右由贝尔实验室搞出来的,却不知那时间却是从那是算起,
谢啦,版主真是热心人.
发表于 2004-8-19 18:08:04 | 显示全部楼层
最初由 lucifer 发表
没有这么简单吧,即使是不算闰年,367*mon/12+day的话,一月1号可就是第31天了

这一点我确实没有考虑到。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表