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.

In reply to Re: setting timezone in windows by BrowserUk
in thread setting timezone in windows by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.