2016-10-19 11 views
3

DateTimeモジュールでis_dst()メソッドを使用して、夏時間の移行が発生しているかどうかを確認しようとしています。Perl DateTime "is_dst()"メソッドが正しく動作しない

私はという非常に基本的な例を書いて始めました。がうまくいくと思いますが、何らかの理由で予期せぬ結果が出ています。


例:

#!/usr/bin/perl 

use strict; 
use warnings; 
use DateTime; 

my $dt1 = DateTime->new(
    'year' => 2015, 
    'month' => 3 , 
    'day' => 8 , 
    'hour' => 3 , 
); 

my $dt2 = DateTime->new(
    'year' => 2015, 
    'month' => 3 , 
    'day' => 7 , 
    'hour' => 3 , 
); 

print $dt1."\n"; 
print $dt2."\n"; 
print $dt1->is_dst()."\n"; 
print $dt2->is_dst()."\n"; 

私は、夏時間の移行を知っていた日付で開始:2015年3月8日(日曜日)3 AMを選択しました。夏時間の移行がその時点ですでに発生していることがわかっていたからです。

は、それから私は私が夏時間の移行の前に知っていた日付を取っ:2015年3月7日(土曜日)3 AMで。

次に、2つの日付とそれに対応するDSTフラグを出力します。

出力:

2015-03-08T03:00:00 
2015-03-07T03:00:00 
0 
0 

二つの日付が期待どおりに印刷しますが、何らかの理由で最初の日付が夏時間の間に発生しても、第二日付が夏時間前に発生節約時間の場合は、両方にDSTフラグが設定されていません。

なぜこれが正しく動作しないのですか?何か不足していますか?

+3

あなたはタイムゾーンを必要とすることができますか? – Veeram

+1

'time_zone => America/Los_Angeles'を追加するとうまくいきます:) – zdim

答えて

6

あなたはexplicitly set the time zoneに持っている:

新しいDateTimeオブジェクトのデフォルトのタイムゾーンは、特に明記した場合を除き、「フローティング」時間帯である...浮動日時はいずれにも固定されていないものをあります特定の時間帯。例えば

use strict; 
use warnings; 
use DateTime; 

my $dt1 = DateTime->new(
    'year'  => 2015, 
    'month'  => 3, 
    'day'  => 8, 
    'hour'  => 3, 
    'time_zone' => 'America/New_York' 
); 

my $dt2 = DateTime->new(
    'year'  => 2015, 
    'month'  => 3, 
    'day'  => 7, 
    'hour'  => 3, 
    'time_zone' => 'America/New_York' 
); 

print $dt1."\n"; 
print $dt2."\n"; 
print $dt1->is_dst()."\n"; 
print $dt2->is_dst()."\n"; 

出力:

2015-03-08T03:00:00 
2015-03-07T03:00:00 
1 
0 
+0

これはうまくいくようです。ありがとう!今、私はDateTimeの減算とDSTフラグの問題を抱えています...しかし、別の質問を投稿する前に少し調べてみましょう。 – tjwrona1992

+2

'' time_zone '=>' local''を現地時間に使用します。 – ikegami

関連する問題