-
Notifications
You must be signed in to change notification settings - Fork 21
Description
mktime incorrectly normalizes struct tm. When year is leap year and you normalize month interval, one day is lost.
eg.:
for (int i = 0; i < 60; ++i) {
tm.tm_mon += 1;
time = mktime(&tm);
printf("%s", ctime(&time));
}
results with:
Tue Feb 1 06:00:00 2000
Wed Mar 1 06:00:00 2000
Sat Apr 1 06:00:00 2000
Mon May 1 06:00:00 2000
Thu Jun 1 06:00:00 2000
Sat Jul 1 06:00:00 2000
Tue Aug 1 06:00:00 2000
Fri Sep 1 06:00:00 2000
Sun Oct 1 06:00:00 2000
Wed Nov 1 06:00:00 2000
Fri Dec 1 06:00:00 2000
Sun Dec 31 06:00:00 2000
Tue Jan 30 06:00:00 2001
Fri Mar 2 06:00:00 2001
Mon Apr 2 06:00:00 2001
Wed May 2 06:00:00 2001
Sat Jun 2 06:00:00 2001
Mon Jul 2 06:00:00 2001
Thu Aug 2 06:00:00 2001
Sun Sep 2 06:00:00 2001
Tue Oct 2 06:00:00 2001
Fri Nov 2 06:00:00 2001
Sun Dec 2 06:00:00 2001
Wed Jan 2 06:00:00 2002
Sat Feb 2 06:00:00 2002
Sat Mar 2 06:00:00 2002
Tue Apr 2 06:00:00 2002
Thu May 2 06:00:00 2002
Sun Jun 2 06:00:00 2002
Tue Jul 2 06:00:00 2002
Fri Aug 2 06:00:00 2002
Mon Sep 2 06:00:00 2002
Wed Oct 2 06:00:00 2002
Sat Nov 2 06:00:00 2002
Mon Dec 2 06:00:00 2002
Thu Jan 2 06:00:00 2003
Sun Feb 2 06:00:00 2003
Sun Mar 2 06:00:00 2003
Wed Apr 2 06:00:00 2003
Fri May 2 06:00:00 2003
Mon Jun 2 06:00:00 2003
Wed Jul 2 06:00:00 2003
Sat Aug 2 06:00:00 2003
Tue Sep 2 06:00:00 2003
Thu Oct 2 06:00:00 2003
Sun Nov 2 06:00:00 2003
Tue Dec 2 06:00:00 2003
Fri Jan 2 06:00:00 2004
Mon Feb 2 06:00:00 2004
Tue Mar 2 06:00:00 2004
Fri Apr 2 06:00:00 2004
Sun May 2 06:00:00 2004
Wed Jun 2 06:00:00 2004
Fri Jul 2 06:00:00 2004
Mon Aug 2 06:00:00 2004
Thu Sep 2 06:00:00 2004
Sat Oct 2 06:00:00 2004
Tue Nov 2 06:00:00 2004
Thu Dec 2 06:00:00 2004
Sat Jan 1 06:00:00 2005