2016-10-19 4 views
3

Я пытаюсь использовать метод is_dst() в модуле DateTime, чтобы определить, произошел переход на летнее время.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"; 

Я начал с датой, что я знал, был переход декретного: воскресенье, 8 марта, 2015. Я выбрал 3 утра, потому что знал, что переход на летнее время уже произошел в этот момент времени.

Тогда я взял дату, я знал, что был до перехода летнее: субботу, 7 марта 2015 также в 3 утра.

Затем я печатаю две даты и соответствующие им флаги 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