根据毫秒数计算出准确的“年/月/日/时/分/秒/星期”并不是件容易的事
来源:互联网 发布:华扬资本长期动态优化 编辑:程序博客网 时间:2024/05/21 17:06
转载于:http://blog.csdn.net/poechant/article/details/7425604
或许一些人,认为自己会调用Windows API、Java SDK的API等等能将毫秒数转换为精确的时间就可以了。但这里讨论的不是如何运用某种语言的某个框架的API,MFC的COleDateTime、Java中的涉及Date的相关接口、JavaScript中的涉及Date的相关接口的内部实现,可能就是本文的类似内容。要实现Nginx等一些高性能server-side的软件,必须要了解如何从根本做起,这不是重新造轮子。
下文中会用到一些公式,比如:empirical formula
和Gauss' formula
等。主要思想取自 Nginx 的时间管理机制中。
1 毫秒、秒、分、时
如果已知毫秒数为:
unsigned int msec_total;
那么秒数和余毫秒数为:
unsigned int sec_total = msec_total / 1000;unsigned int msec = msec_total % 1000; /* What we want */
分钟数和余秒数为:
unsigned int min_total = sec_total / 60;unsigned int sec = sec_total % 60;
小时数和余分钟数为:
unsigned int hour_total = min_total / 60;unsigned int min = min_total % 60;
余小时数为:
unsigned int hour = hour_total % 24;
剩下的内容非常重要。
2 总天数
unsigned int day_total = hour_total / 24;day_total = day_total - (31 + 28) + 719527; /* days since March 1, 1 BC */
3 年数
什么是闰年?有如下几类:
- 能被4整除,但不能被100整除;
- 能被400整除。
所以总年数是:
/* 总年数 */year = (days + 2) * 400 / (365 * 400 + 100 - 4 + 1);
还要继续知道整年的余天:
/* yday是整年的余天 */yday = days - (365 * year + year / 4 - year / 100 + year / 400);/* 如果余天小于0,说明年数应该减一 */if (yday < 0) { /* 可以被4整除,且不可以被100整除,且可以被400整除 */ leap = (year % 4 == 0) && (year % 100 || (year % 400 == 0)); /* 加当年的年数补差值 */ yday = 365 + leap + yday; year--;}
具体的解释看注释。
4 月份和日期
转载请注明来自柳大的CSDN博客:Blog.CSDN.net
这里用到empirical formula
和Gauss' formula
。
/* * The empirical formula that maps "yday" to month. * There are at least 10 variants, some of them are: * mon = (yday + 31) * 15 / 459 * mon = (yday + 31) * 17 / 520 * mon = (yday + 31) * 20 / 612 *//* 30.6 为平均每月天数 */mon = (yday + 31) * 10 / 306;/* the Gauss' formula that evaluates days before the month */mday = yday - (367 * mon / 12 - 30) + 1;if (yday >= 306) { year++; mon -= 10; /* * there is no "yday" in Win32 SYSTEMTIME * * yday -= 306; */} else { mon += 2; /* * there is no "yday" in Win32 SYSTEMTIME * * yday += 31 + 28 + leap; */}
5 星期
wday = (4 + days) % 7; /* 今儿是星期几?注意,1970年1年1日为星期四 */
6 整理日期
msec; /* 毫秒 */sec; /* 秒 */min; /* 分 */hour; /* 小时 */mday; /* 日 */mon; /* 月 */year; /* 年 */wday; /* 星期 */
- 根据毫秒数计算出准确的“年/月/日/时/分/秒/星期”并不是件容易的事
- 根据毫秒数计算出准确的“年/月/日/时/分/秒/星期”并不是件容易的事
- iPhone开发--NSData年、月、星期、日、时、分、秒和毫秒获取及NSDataToNSString方法
- 如何取得从1970年1月1日0时0分0秒到现在的毫秒数?
- java 毫秒转换成时,分,秒,毫秒 && 根据开始时间和天数,计算出几天后的时间
- NSDate 年 月 日 星期 毫秒数
- iOS 获取指定日期的时间(年、月、日、星期、时、分、秒等)
- js获取年、月、日、时、分、秒、毫秒函数
- Calendar获取年、月、日、时、分、秒、毫秒
- NSData年、月、星期、日、时、分、秒
- 3月14日相约CSDN聊天室: ASP.NET 想说爱你并不件容易的事?
- 3月14日相约CSDN聊天室: ASP.NET 想说爱你并不件容易的事?
- 3月14日相约CSDN聊天室: ASP.NET 想说爱你并不件容易的事?
- 3月14日相约CSDN聊天室: ASP.NET 想说爱你并不件容易的事?
- 3月14日相约CSDN聊天室: ASP.NET 想说爱你并不件容易的事?
- 3月14日相约CSDN聊天室: ASP.NET 想说爱你并不件容易的事?
- 3月14日相约CSDN聊天室: ASP.NET 想说爱你并不件容易的事?
- 3月14日相约CSDN聊天室: ASP.NET 想说爱你并不件容易的事?
- 大话集群
- Objective-C 编程语言(5)属性----概述
- arm-linux启动过程
- 与Lock和Latch相关的动态性能视图
- 用标签为Gtktreeview列添加名字
- 根据毫秒数计算出准确的“年/月/日/时/分/秒/星期”并不是件容易的事
- 神奇的vfork()
- linux 命令 dd
- u-boot2011.12在mini2440上的移植1
- 动态规划
- datagrid 与 dataPager 分页
- ubuntu android模拟器安装软件apk
- glusterfs分布式,冗余卷读写操作过程
- 浅谈MySQL主键