- 论坛徽章:
- 0
|
一个比较有意思的问题
在回答这个问题前,先说一点题外话:简单就是美。
Unix在制定时间的标准上很简单,那就是以EPOCH为时间起点,秒的增加数为"Unix原始日历时间",这样就可以统一系统时间,不用考虑国际日期变更线之类的问题,它是UNIX处理时间的基础,所以要得到struct tm,先lt=time(NULL),然后today=localtime(<)。
再看看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为我们提供了这么一个好的相互交流学习的平台,我很珍惜,我也希望其他的朋友也能珍惜,不要象在其他论坛上那样乱灌水!光看不回,也不会挨什么板砖。但如果你知道该问题的解决方法,还请贴出来共享。 |
|