in reply to setting timezone in windows
Seems to be a limitation of Perl that it only honours the setting at startup. If you change it within your script and spawn a child, then the spawned Perl sees and honours the change.
P:\test>perl -le"print scalar localtime; $ENV{TZ}='PST8PDT'; print sca +lar localtime; system 'perl -le \"print scalar localtime\"' " Thu Jan 19 19:52:12 2006 Thu Jan 19 19:52:12 2006 Thu Jan 19 11:52:12 2006
According the CRT docs, it has an equivalent of the POSIX tzset() call (_tzset), but neither the tzset() exported by the POSIX module, nor calling the CRT _tzset() after having set the TZ within the program, has any affect upon the times returned by localtime within the current process.
However, running this
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <time.h> DWORD main(int argc, char *argv[]) { struct tm *newtime; char am_pm[] = "AM"; __time64_t long_time; _putenv( argv[1] ); _time64( &long_time ); /* Get time as long integer. + */ newtime = _localtime64( &long_time ); /* Convert to local time. */ if( newtime->tm_hour > 12 ) /* Set up extension. */ strcpy( am_pm, "PM" ); if( newtime->tm_hour > 12 ) /* Convert from 24-hour */ newtime->tm_hour -= 12; /* to 12-hour clock. */ if( newtime->tm_hour == 0 ) /*Set hour to 12 if midnight. * +/ newtime->tm_hour = 12; printf( "%.19s %s\n", asctime( newtime ), am_pm ); return 0; }
seems to do the appropriate thing,
P:\test>ltime TZ=PST8PDT Thu Jan 19 12:20:55 AM
so it seems Perl is not doing so under Win32.
Theoretically, you could do the same steps shown in the C code above from within your perl script using Win32::API to import the CRT functions directly from the MS CRT DLL, but it is simpler to conditionally set the TZ and then exec yourself like this:
#! perl -slw use strict; unless( $ENV{TZ} ) { $ENV{TZ} = 'PST8PDT'; exec "$^X $0"; } print scalar localtime; __END__ P:\test>524251 P:\test>Thu Jan 19 12:32:30 2006
but that's not so useful if you want to change the TZ many times. In that case it's probably easier to just spawn a perl one-liner and retrieve the values that way:
#! perl -slw use strict; print "default:" . localtime(); $ENV{TZ} = 'GST1GDT'; print `perl -le"print 'Germany: ' . localtime()"`; $ENV{TZ} = 'PST8PDT'; print `perl -le"print 'Pacific: ' . localtime()"`; __END__ P:\test>524251-2 default:Thu Jan 19 20:41:24 2006 Germany: Thu Jan 19 19:41:24 2006 Pacific: Thu Jan 19 12:41:24 2006
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: setting timezone in windows
by nicoaimetti (Acolyte) on Jan 19, 2006 at 21:46 UTC |