How do I set the timezone for Perl's localtime()?

后端 未结 6 2033

In Perl, I\'d like to look up the localtime in a specific timezone. I had been using this technique:

$ENV{TZ} = \'America/Los_Angeles\';
my $now = scalar loc         


        
6条回答
  •  -上瘾入骨i
    2020-12-05 19:33

    Executive Summary:

    Setting $ENV{TZ}='/*&+000000000005' and calling Time::Piece::_tzset() fixes localtime() to agree with the windoz system clock.

    Sanguinarily gory details:

    On Strawberry Perl, windoz 7/64, none of the "Standard" time zones works in the TZ environmental variable to localize localtime(). 'America/Chicago' gives exactly the same time as 'America/Los_Angeles' == 'CDT' == 'CST' == 'UTC' == '-01:00', etc. The list is infinite.

    Every timezone on http://www.timeanddate.com/time/zones/ that I tried gives the right time if you are in Greenwich.

    Every time from: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones also fails to change localtime() at all. And, there is no apparent indication. They do nothing and say nothing.

    There is NO tzset() on windoz: POSIX::tzset not implemented on this architecture

    There is not even any concept of POSIX ??? C:\bin>cpan install POSIX ... Warning: Cannot install POSIX, don't know what it is. Try the command i /POSIX/

    It appears to be baked into win8 and there are some dot NOT libraries for it.

    For Austin, Texas, in the very Center of Central Intergalactic Time, thee correct $ENV{TZ} which gives me a scalar localtime() which ~agrees with the o/s level time function and the windoz clock is: '/*&+5' !!! Yes Slash-Star-Ampersand-Plus-5 works!

    P:\br1\sxsw.2015\sx-2015.0318\done>time The current time is: 16:36:39.44 ... Time=Apr 14 16:36:42 2015, ENV->TZ=/*&+5

    By running a for loop and trying random values from various posts, for Strawberry Perl uname='Win32 strawberry-perl 5.18.2.2...' with known timezone bugs, any 3 chars I tried (didn't try + or -) followed by +/- and a small number worked. Here is an array of text values and their output below:

    use Time::Piece;
    @tz = ('', 'CDT+5', 'CST+5', 'FKU+5', 'XYZ+5', '+5', '+05', '+05.00', 
        'America/Chicago', 'America/Los_Angeles', 'CDT', 
        'CST', 'UTC', 'PDT', 'PST', '-01:00', '+01:00', '-05:00'.
        'ACDT', 'EASST', '5000', '+0500', '+5:00', '+05:00', 'SSS+1', 'SSS+0',
        'zzz-1', 'ZZ1+5', '123+5', '___+5', '/*&+5', , '/*&+05', '/*&+005',
        '/*&+000000000005');
    foreach $tz (@tz)  {
        $ENV{TZ} = $tz         if $tz;
        Time::Piece::_tzset()  if $tz;
        printf("T%s, ENV->TZ=%s\n", scalar localtime, $ENV{TZ}  ||  'NoTZ');
    }
    

    Most every try with anything but XXX . +|- . integer gave UTC, but many were an hour off for no reason (America/Los_Angeles and America/Chicago gave the same value). I am almost sure I used to get away with just CDT and CST, possibly on Activestate (switched to Strawberry to compile my own Perl modules rather than rely on Activestate for everything). This is the first major snarl.

    I rebuilt DateTime from scratch and it worked fine. DateTime::TimeZone::Local::Win32 "failed for 'Win32::TieRegistry'"

    Here's the sorted result of the attempted zones above:

        P:\br1\sxsw.2015\sx-2015.0318\done>bb | sort
        Running c:/bin/bb.pl  Tue Apr 14 21:43:56 2015
        TTue Apr 14 16:43:56 2015, ENV->TZ=/*&+000000000005
        TTue Apr 14 16:43:56 2015, ENV->TZ=/*&+005
        TTue Apr 14 16:43:56 2015, ENV->TZ=/*&+05
        TTue Apr 14 16:43:56 2015, ENV->TZ=/*&+5
        TTue Apr 14 16:43:56 2015, ENV->TZ=___+5
        TTue Apr 14 16:43:56 2015, ENV->TZ=123+5
        TTue Apr 14 16:43:56 2015, ENV->TZ=CDT+5
        TTue Apr 14 16:43:56 2015, ENV->TZ=CST+5
        TTue Apr 14 16:43:56 2015, ENV->TZ=FKU+5
        TTue Apr 14 16:43:56 2015, ENV->TZ=XYZ+5
        TTue Apr 14 16:43:56 2015, ENV->TZ=ZZ1+5
        ABOVE ALL WORKED Below most failed with UTC or +1 hour???
        TTue Apr 14 20:43:56 2015, ENV->TZ=SSS+1
        TTue Apr 14 21:43:56 2015, ENV->TZ=-01:00
        TTue Apr 14 21:43:56 2015, ENV->TZ=+01:00
        TTue Apr 14 21:43:56 2015, ENV->TZ=+05
        TTue Apr 14 21:43:56 2015, ENV->TZ=+05:00
        TTue Apr 14 21:43:56 2015, ENV->TZ=+0500
        TTue Apr 14 21:43:56 2015, ENV->TZ=+5
        TTue Apr 14 21:43:56 2015, ENV->TZ=+5:00
        TTue Apr 14 21:43:56 2015, ENV->TZ=5000
        TTue Apr 14 21:43:56 2015, ENV->TZ=CDT
        TTue Apr 14 21:43:56 2015, ENV->TZ=CDT
        TTue Apr 14 21:43:56 2015, ENV->TZ=CST
        TTue Apr 14 21:43:56 2015, ENV->TZ=PDT
        TTue Apr 14 21:43:56 2015, ENV->TZ=PST
        TTue Apr 14 21:43:56 2015, ENV->TZ=SSS+0
        TTue Apr 14 21:43:56 2015, ENV->TZ=UTC
        TTue Apr 14 22:43:56 2015, ENV->TZ=-05:00ACDT
        TTue Apr 14 22:43:56 2015, ENV->TZ=+05.00
        TTue Apr 14 22:43:56 2015, ENV->TZ=America/Chicago
        TTue Apr 14 22:43:56 2015, ENV->TZ=America/Los_Angeles
        TTue Apr 14 22:43:56 2015, ENV->TZ=EASST
        TTue Apr 14 22:43:56 2015, ENV->TZ=zzz-1
    
    • Even after finding and installing the Holy Grail, the TzFile module for the Olsen Database, it is still screwed, no difference!

      Installing C:\bin\strawberry_perl_5_18\perl\site\lib\DateTime\TimeZone\Tzfile.pm ZEFRAM/DateTime-TimeZone-Tzfile-0.010.tar.gz C:\bin\strawberry_perl_5_18\perl\bin\perl.exe ./Build install --uninst 1 -- OK

    Here are all of the alleged timezones which do nothing on this platform from: @atz = DateTime::TimeZone->all_names(); printf("All tz names [%d] = %s\n", scalar @atz, join(", ", @atz));

    All tz names [349] = Africa/Abidjan, Africa/Accra, Africa/Algiers, Africa/Bissau, Africa/Cairo, Africa/Casablanca, Africa/Ceuta, Africa/El_Aaiun, Africa/Johannesburg, Africa/Khartoum, Africa/Lagos, Africa/Maputo, Africa/Monrovia, Africa/Nairobi, Africa/Ndjamena, Africa/Tripoli, Africa/Tunis, Africa/Windhoek, America/Adak, America/Anchorage, America/Araguaina, America/Argentina/Buenos_Aires, America/Argentina/Catamarca, America/Argentina/Cordoba, America/Argentina/Jujuy, America/Argentina/La_Rioja, America/Argentina/Mendoza, America/Argentina/Rio_Gallegos, America/Argentina/Salta, America/Argentina/San_Juan, America/Argentina/San_Luis, America/Argentina/Tucuman, America/Argentina/Ushuaia, America/Asuncion, America/Atikokan, America/Bahia, America/Bahia_Banderas, America/Barbados, America/Belem, America/Belize, America/Blanc-Sablon, America/Boa_Vista, America/Bogota, America/Boise, America/Cambridge_Bay, America/Campo_Grande, America/Cancun, America/Caracas, America/Cayenne, America/Chicago, America/Chihuahua, America/Costa_Rica, America/Creston, America/Cuiaba, America/Curacao, America/Danmarkshavn, America/Dawson, America/Dawson_Creek, America/Denver, America/Detroit, America/Edmonton, America/Eirunepe, America/El_Salvador, America/Fortaleza, America/Glace_Bay, America/Godthab, America/Goose_Bay, America/Grand_Turk, America/Guatemala, America/Guayaquil, America/Guyana, America/Halifax, America/Havana, America/Hermosillo, America/Indiana/Indianapolis, America/Indiana/Knox, America/Indiana/Marengo, America/Indiana/Petersburg, America/Indiana/Tell_City, America/Indiana/Vevay, America/Indiana/Vincennes, America/Indiana/Winamac, America/Inuvik, America/Iqaluit, America/Jamaica, America/Juneau, America/Kentucky/Louisville, America/Kentucky/Monticello, America/La_Paz, America/Lima, America/Los_Angeles, America/Maceio, America/Managua, America/Manaus, America/Martinique, America/Matamoros, America/Mazatlan, America/Menominee, America/Merida, America/Metlakatla, America/Mexico_City, America/Miquelon, America/Moncton, America/Monterrey, America/Montevideo, America/Montreal, America/Nassau, America/New_York, America/Nipigon, America/Nome, America/Noronha, America/North_Dakota/Beulah, America/North_Dakota/Center, America/North_Dakota/New_Salem, America/Ojinaga, America/Panama, America/Pangnirtung, America/Paramaribo, America/Phoenix, America/Port-au-Prince, America/Port_of_Spain, America/Porto_Velho, America/Puerto_Rico, America/Rainy_River, America/Rankin_Inlet, America/Recife, America/Regina, America/Resolute, America/Rio_Branco, America/Santa_Isabel, America/Santarem, America/Santiago, America/Santo_Domingo, America/Sao_Paulo, America/Scoresbysund, America/Sitka, America/St_Johns, America/Swift_Current, America/Tegucigalpa, America/Thule, America/Thunder_Bay, America/Tijuana, America/Toronto, America/Vancouver, America/Whitehorse, America/Winnipeg, America/Yakutat, America/Yellowknife, Antarctica/Casey, Antarctica/Davis, Antarctica/DumontDUrville, Antarctica/Macquarie, Antarctica/Mawson, Antarctica/Palmer, Antarctica/Rothera, Antarctica/Syowa, Antarctica/Troll, Antarctica/Vostok, Asia/Almaty, Asia/Amman, Asia/Anadyr, Asia/Aqtau, Asia/Aqtobe, Asia/Ashgabat, Asia/Baghdad, Asia/Baku, Asia/Bangkok, Asia/Beirut, Asia/Bishkek, Asia/Brunei, Asia/Chita, Asia/Choibalsan, Asia/Colombo, Asia/Damascus, Asia/Dhaka, Asia/Dili, Asia/Dubai, Asia/Dushanbe, Asia/Gaza, Asia/Hebron, Asia/Ho_Chi_Minh, Asia/Hong_Kong, Asia/Hovd, Asia/Irkutsk, Asia/Jakarta, Asia/Jayapura, Asia/Jerusalem, Asia/Kabul, Asia/Kamchatka, Asia/Karachi, Asia/Kathmandu, Asia/Khandyga, Asia/Kolkata, Asia/Krasnoyarsk, Asia/Kuala_Lumpur, Asia/Kuching, Asia/Macau, Asia/Magadan, Asia/Makassar, Asia/Manila, Asia/Nicosia, Asia/Novokuznetsk, Asia/Novosibirsk, Asia/Omsk, Asia/Oral, Asia/Pontianak, Asia/Pyongyang, Asia/Qatar, Asia/Qyzylorda, Asia/Rangoon, Asia/Riyadh, Asia/Sakhalin, Asia/Samarkand, Asia/Seoul, Asia/Shanghai, Asia/Singapore, Asia/Srednekolymsk, Asia/Taipei, Asia/Tashkent, Asia/Tbilisi, Asia/Tehran, Asia/Thimphu, Asia/Tokyo, Asia/Ulaanbaatar, Asia/Urumqi, Asia/Ust-Nera, Asia/Vladivostok, Asia/Yakutsk, Asia/Yekaterinburg, Asia/Yerevan, Atlantic/Azores, Atlantic/Bermuda, Atlantic/Canary, Atlantic/Cape_Verde, Atlantic/Faroe, Atlantic/Madeira, Atlantic/Reykjavik, Atlantic/South_Georgia, Atlantic/Stanley, Australia/Adelaide, Australia/Brisbane, Australia/Broken_Hill, Australia/Currie, Australia/Darwin, Australia/Eucla, Australia/Hobart, Australia/Lindeman, Australia/Lord_Howe, Australia/Melbourne, Australia/Perth, Australia/Sydney, CET, CST6CDT, EET, EST, EST5EDT, Europe/Amsterdam, Europe/Andorra, Europe/Athens, Europe/Belgrade, Europe/Berlin, Europe/Brussels, Europe/Bucharest, Europe/Budapest, Europe/Chisinau, Europe/Copenhagen, Europe/Dublin, Europe/Gibraltar, Europe/Helsinki, Europe/Istanbul, Europe/Kaliningrad, Europe/Kiev, Europe/Lisbon, Europe/London, Europe/Luxembourg, Europe/Madrid, Europe/Malta, Europe/Minsk, Europe/Monaco, Europe/Moscow, Europe/Oslo, Europe/Paris, Europe/Prague, Europe/Riga, Europe/Rome, Europe/Samara, Europe/Simferopol, Europe/Sofia, Europe/Stockholm, Europe/Tallinn, Europe/Tirane, Europe/Uzhgorod, Europe/Vienna, Europe/Vilnius, Europe/Volgograd, Europe/Warsaw, Europe/Zaporozhye, Europe/Zurich, HST, Indian/Chagos, Indian/Christmas, Indian/Cocos, Indian/Kerguelen, Indian/Mahe, Indian/Maldives, Indian/Mauritius, Indian/Reunion, MET, MST, MST7MDT, PST8PDT, Pacific/Apia, Pacific/Auckland, Pacific/Bougainville, Pacific/Chatham, Pacific/Chuuk, Pacific/Easter, Pacific/Efate, Pacific/Enderbury, Pacific/Fakaofo, Pacific/Fiji, Pacific/Funafuti, Pacific/Galapagos, Pacific/Gambier, Pacific/Guadalcanal, Pacific/Guam, Pacific/Honolulu, Pacific/Kiritimati, Pacific/Kosrae, Pacific/Kwajalein, Pacific/Majuro, Pacific/Marquesas, Pacific/Nauru, Pacific/Niue, Pacific/Norfolk, Pacific/Noumea, Pacific/Pago_Pago, Pacific/Palau, Pacific/Pitcairn, Pacific/Pohnpei, Pacific/Port_Moresby, Pacific/Rarotonga, Pacific/Tahiti, Pacific/Tarawa, Pacific/Tongatapu, Pacific/Wake, Pacific/Wallis, UTC, WET

提交回复
热议问题