继续my attempt to create a DateTime class,我试图在我的函数中存储“纪元”时间:
void DateTime::processComponents(int month, int day, int year,
int hour, int minute, int second) {
struct tm time;
time.tm_hour = hour;
time.tm_min = minute;
time.tm_sec = second;
time.tm_mday = day;
time.tm_mon = month;
time.tm_year = year - 1900;
ticks_ = mktime(&time);
processTm(time);
}
void DateTime::processTm(struct tm time) {
second_ = time.tm_sec;
minute_ = time.tm_min;
hour_ = time.tm_hour;
weekday_ = time.tm_wday;
monthday_ = time.tm_mday;
yearday_ = time.tm_yday;
month_ = time.tm_mon;
year_ = time.tm_year + 1900;
}
对于任意日期processComponents(5,5,1990,1,23,45)
(1990年6月6日上午1:23:45),它会正确地按预期设置所有值。
但是,经过进一步测试,我发现processComponents(0,0,1970,0,0,0)
(1970年1月1日上午12:00:00),mktime(&time)
会导致time
搞砸:
time.tm_mon = 11;
time.tm_mday = 30;
time.tm_year = 69;
time.tm_hour = 23;
time.tm_min = 0;
time.tm_sec = 0;
time.tm_isdst = 0;
time.tm_gmtoff = -18000;
time.tm_zone = "EST";
time.tm_wday = 2;
time.tm_yday = 363;
转换为1969年12月31日晚上11:00:00。
我可以验证mktime()
是否有责任,因为通过评论该行,它会正确地报告日期和时间为1970年1月1日12:00:00 am。
为什么mktime()
只会弄乱时代?我该如何解决/解决这个问题?
谢谢!
答案 0 :(得分:5)
您传递0作为day
参数并将其放入time.tm_mday
。 struct tm
的那个组件(只有那个组件)是基于1的,而不是基于0的。
不要问我为什么。
要指定1970年1月1日上午12:00:00,您可以这样称呼它:
processComponents(0,1,1970,0,0,0);
作为sdtom mentioned,您需要确保tm_isdst
设置正确 - 0表示无效,正表示有效,负表示您不知道(其中)案例mktime()
应该尝试猜测。)
只是为了通知您,当我将您的日期(1970年1月1日,00:00:00)传递给MSVC 9中的mktime()
时,它会返回错误(传入的struct tm
是未触及且返回的time_t
值为-1)。
答案 1 :(得分:3)
由于它关闭了一个小时我会期待夏令时。 time.tm_isdst的值是否设置在某处?如果您没有设置它,它可能会被随机设置为1或0,这会影响您的结果。
答案 2 :(得分:0)
将全零传递给mktime()
被解释为“Sun Jan 0 00:00:00 1900”。基于此,需要进行一些调整......
// the input is local time
// the output is seconds since the epoch
// The epoch is Jan 1, 1970 @ 0:00 GMT
time_t mktime_wrapper( int month, int day, int year,
int hour=0, int min=0, int sec=0, bool isDST=-1
)
{
tm t;
t.tm_sec=sec, t.tm_min=min, t.tm_hour=hour, t.tm_isdst=isDST;
t.tm_mday=day, t.tm_mon=month-1, t.tm_year=year-1900;
return mktime( &t );
}