2016-07-08 32 views
7

私は最近how to change the timezone returned by localtime in Perlを学びました。Perlスクリプトはいつ `localtime`を呼び出す前に` tzset`を呼び出す必要がありますか?

use POSIX qw(tzset); 
print localtime . "\n"; 
$ENV{TZ} = 'America/Los_Angeles'; 
print localtime . "\n"; 
tzset; 
print localtime . "\n"; 

出力

Wed Apr 15 15:58:10 2009 
Wed Apr 15 15:58:10 2009 
Wed Apr 15 12:58:10 2009 

時間だけtzsetを呼び出した後にどのように変化するかに注意してください。

This is perl, v5.8.8 built for x86_64-linux-thread-multi 

しかし、私のシステムでは、私は、私のシステムで、時間がtzsetを呼び出すずにがどのように変化するかを

Fri Jul 8 19:00:51 2016 
Fri Jul 8 16:00:51 2016 
Fri Jul 8 16:00:51 2016 

お知らせを取得しています。これは、すべて私のテストはtzsetは影響を与えないことを示しているのであれば、他のなぜ/どのようなシステムを明示的に呼び出されるtzsetを必要と

のSolaris 10上でUbuntuとIllumosでのPerlの最近のバージョンにも当てはまるだけでなく、Perlのv5.8.8?特定の環境との互換性を保つためにはまだtzsetに電話する必要がありますか、それとも過去のことですか?

+1

http://perldoc.perl.org/perlport.html#Time-and-Date tl; dr - 時刻と暦日のシステムの概念は、幅広く異なる方法で制御されています。タイムゾーンが$ ENV {TZ}に格納されていると仮定しないでください。タイムゾーンが$ ENV {TZ}に格納されていると仮定しないでください。 – xxfelixxx

+0

私は何か具体的にしたいと思います。私のテストは 'tzset'を呼び出さないことが安全であることを示しています。ここのソフトウェアは特定のプラットフォーム向けのものなので、私のチームには不要な余分な作業をするように伝えたくありません。だから、どんな条件で 'tzset'が必要なのでしょうか? –

+1

回答が投稿されて削除されましたが、http://pubs.opengroup.org/onlinepubs/9699919799/functions/localtime.htmlにリンクしています。*「localtime()がtzset()を呼び出したようにローカルタイムゾーン情報が使用されます。 "*、システムがPOSIXに準拠している場合、' localtime'は 'tzset'を自動的に呼び出さなければなりませんか?これは、OSがPOSIXに準拠しているかどうかを決定する要因ですか? –

答えて

4

TL; DR$ENV{TZ}はもう必要ありません変更する際tzsetを呼び出す(2011年発売)Perl v5.8.9から開始。


tzset(3)を呼び出すために必要とされていないPerlのlocaltime通話localtime_r(3)internally、。 Linux manpageはアドバイス:

をPOSIX.1-2004によると、localtimeのは()localtime_r()はこの 要件はありませんが tzset(3)は、呼ばれていたかのように振る舞うために必要とされます。移植可能なコードの場合、tyset(3)は localtime_r()の前に呼び出されるべきです。

古い非マルチスレッドのPerlでは

、またはlocaltime_r(3)は、ビルド時に利用できなかった場合は、localtime(3)が代わりに使用されています。その場合には、tzsetへの呼び出しがper POSIX、不必要だったでしょう:

ローカルタイムゾーン情報は(localtimeのかのように使用されている)(tzsetを呼び出します)

どこglibc didn't adhere to that倍であったとあるようですが、 :

すべての時間をtzset呼び出すことはありません任意のコードについては

これは間違いなく がは変更されません。それはあまりにも高価です。そして何のために?ワールドツアーでラップトップを使用する人の0.000001% は、たとえば のネイティブタイムゾーンに従った日付のsyslogメッセージを期待しています。これは十分な正当化ではない です。マシンを再起動するだけです。しかし、唯一のあなたのPerlが使用するようにコンパイルされたものではないかもしれませんどのlocaltime非リエントラントのため、この

変更いえなかったとtztime(3)が呼び出されたかのようにglibcが今行動ありません。

#26136#41591という2つのPerlバグレポートがあります。

修正点として、暗黙的にtzset(3)を実行する必要があるかどうかを、Perlは今やdecides at configuration timeにしています。これにより、ユーザーコードでそれを余分に指定するようになります。

関連する問題