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
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
|