On Wednesday 19 November 2025 23:49:15 Martin Storsjö wrote:
> On Wed, 19 Nov 2025, Pali Rohár wrote:
> 
> > Thanks for input. I started writing new TZ=PST8PDT tests and I they are
> > failing, seems like some another issue with _localtime64. I started
> > debugging it and I figured out that the my test is failing even with the
> > native CRT 32-bit locatime version on Windows XP.
> > 
> > Here is the test:
> > 
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <string.h>
> > #include <time.h>
> > #include <assert.h>
> > 
> > #ifdef __GLIBC__
> > typedef long int __time32_t;
> > struct tm *_localtime32(const __time32_t *timep) { return 
> > localtime(&(time_t){*timep}); }
> > __time32_t _mktime32(struct tm *tm) { return mktime(tm); }
> > #endif
> > 
> > int main() {
> >  __time32_t t32, t32_;
> >  struct tm *htm;
> >  struct tm tm2;
> > 
> >  putenv ("TZ=PST8PDT");
> >  tzset ();
> > 
> >  t32 = 1130661000; /* Sun Oct 30 08:30:00 UTC 2005 == Sun Oct 30 01:30:00 
> > PDT 2005 */
> >  htm = _localtime32 (&t32);
> >  tm2 = *htm;
> >  printf ("pacific _localtime32(%ld): sec=%d min=%d hour=%d mday=%d mon=%d 
> > year=%d wday=%d yday=%d isdst=%d\n",
> >      t32, htm->tm_sec, htm->tm_min, htm->tm_hour, htm->tm_mday, 
> > htm->tm_mon, htm->tm_year, htm->tm_wday, htm->tm_yday, htm->tm_isdst);
> >  t32_ = _mktime32 (htm);
> >  printf ("pacific _mktime32(): %ld   sec=%d min=%d hour=%d mday=%d mon=%d 
> > year=%d wday=%d yday=%d isdst=%d\n",
> >      t32_, htm->tm_sec, htm->tm_min, htm->tm_hour, htm->tm_mday, 
> > htm->tm_mon, htm->tm_year, htm->tm_wday, htm->tm_yday, htm->tm_isdst);
> >  fflush (stdout);
> >  assert (t32_ == t32);
> >  assert (memcmp (htm, &tm2, sizeof(tm2)) == 0);
> > 
> >  return 0;
> > }
> > 
> > On Windows XP when compiled with system os msvcrt.dll library it is
> > failing with error:
> > 
> > pacific _localtime32(1130661000): sec=0 min=30 hour=1 mday=30 mon=9 
> > year=105 wday=0 yday=302 isdst=1
> > pacific _mktime32(): 1130664600   sec=0 min=30 hour=1 mday=30 mon=9 
> > year=105 wday=0 yday=302 isdst=0
> > Assertion failed: t32_ == t32, file test.c, line 30
> > 
> 
> Hmm, so it seems like _localtime32 does the right thing, but _mktime32 fails
> to handle the daylight saving time aspect.
> 
> > Do you have any idea what is wrong here? Bug in the msvcrt.dll or I have
> > missed something in the test?
> 
> I tested this on a Windows 11 machine, and there it does produce the right
> result, so something seems to have changed in msvcrt.dll (or other system
> components relating to this) between XP and 11.
> 
> // Martin

Ok, thanks for confirmation.

I checked Windows 10 and its msvcrt.dll is working fine too.
I checked also versioned msvcr* libs and 80-120 are working too.
msvcr70 and older are broken.

I will adjust test that with pre80 libs the mktime can return incorrect
result.


_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to