http://qs1969.pair.com?node_id=517872


in reply to How to convert time from one time zone to another

You can just set the TZ environment variable to the timezone you want, and use localtime:
{ local $ENV{TZ} = "EST+05"; print "In New York, it is ".localtime()."\n"; } { local $ENV{TZ} = "IST-05:30"; print "In Mumbai, it is ".localtime()."\n" }
The last time I ran it, this printed
In New York, it is Mon Dec 19 14:25:01 2005 In Mumbai, it is Tue Dec 20 00:55:01 2005
I think this will work on Windows as well as Unix, but I don't have a Windows box to test it on.

Replies are listed 'Best First'.
Re^2: How to convert time from one time zone to another
by Celada (Monk) on Dec 19, 2005 at 21:32 UTC

    You should probably use the named timezones instead of numeric pseudo timezones as you have. For example, US/Eastern for New York. Your example will show an incorrect time for New York in the summer.

      You have a good point. There is a frustrating trade-off, in that “numeric pseudo-timezones” are pretty portable. The named (Olson) timezones still won’t work everywhere, unfortunately, although the situation is improving.

      If portability is not a concern, and the Olson names work on your system, you should definitely use them. If you need to be portable and to deal with all the intricacies of daylight saving time, you probably have to use DateTime with DateTime::TimeZone (which parses the Olson database) and install a copy of the Olson database if your system doesn't already have it.

      (Unless there's a better way that I don't know about?)

      Update: Actually I think the module is distributed with a pre-parsed copy of the database, so at least you don't have to worry about that. It's still a lumbering behemoth whose documentation is rather confusing, at least to me; but it should give accurate results at least.

      Actually I don't think the statement (that parent's code will produce an incorrect time during DST) is correct but neither do I think Robin's surmise that the code in Re: How to convert time from one time zone to another will "work on Windows" is universally correct. Under Windows7:
      #!/usr/bin/perl use 5.014; # convert TZ say "\$ENV{TZ}: $ENV{TZ}"; # var had to be manually added on stock + W7 { local $ENV{TZ} = "EST+05"; say "In New York, it is " . localtime(); } { local $ENV{TZ} = "IST-05:30"; # does not return c +orrect time on W7 say "In Mumbai, it is " . localtime(); # but, rather, same + as NY localtime }

      outputs:

      $ENV{TZ}: EST5EDT # TZ is set but this does + # not appear to be defaul +t (for Win7) In New York, it is Mon Apr 2 10:41:23 2012 # correct In Mumbai, it is Mon Apr 2 10:41:23 2012 #obviously wrong

      But this may be the result of a misconception on my part about 'doze ENV and its vars.
          Anyone care to explicate?