2016-10-19 3 views
3

Ich versuche, die is_dst() Methode im DateTime Modul zu verwenden, um festzustellen, ob eine Umstellung der Sommerzeit auftritt.Perl DateTime "is_dst()" Methode funktioniert nicht richtig

Ich begann mit dem Schreiben eines sehr einfachen Beispiels, dass ich sicher würde funktionieren, aber aus irgendeinem Grund bekomme ich unerwartete Ergebnisse.


Beispiel:

#!/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"; 

begann ich mit einem Datum, das ich kannte einen Sommer Übergang war: Sonntag, 8. März 2015. Ich wählte 3 AM, weil ich wusste, dass der Übergang der Sommerzeit zu diesem Zeitpunkt bereits stattgefunden hätte.

Dann nahm ich ein Datum, das ich vor dem Sommer Übergang wusste, war: bei 03.00Samstag, 7. März 2015 auch.

Dann drucke ich die zwei Daten und ihre entsprechenden DST-Flags.

Ausgang:

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

Die beiden Daten genau drucken, wie erwartet, aber aus irgendeinem Grund, obwohl das erste Datum tritt während der Sommerzeit, und das zweite Datum tritt vor Tagesanbruch Sparzeit, das DST-Flag ist nicht für beide gesetzt.

Warum funktioniert das nicht richtig? Fehle ich etwas?

+3

können Sie eine Zeitzone benötigen? – Veeram

+1

Wenn ich 'time_zone => America/Los_Angeles' hinzufüge ist es in Ordnung :) – zdim

Antwort

6

Sie müssen explicitly set the time zone:

Die Standardzeitzone für neue Datetime-Objekte, sofern nicht anders angegeben, ist die „schwebende“ Zeitzone ... Ein schwimmender Datetime ist eine, die nicht zu einem verankert ist bestimmte Zeitzone.

Zum Beispiel:

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"; 

Ausgang:

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

Das scheint zu funktionieren. Vielen Dank! Jetzt habe ich ein Problem mit der DateTime-Subtraktion und dem DST-Flag ... Aber ich werde mich ein bisschen darum kümmern, bevor ich eine andere Frage stelle. – tjwrona1992

+2

Verwenden Sie ''time_zone' => 'local'' für die lokale Zeit. – ikegami

Verwandte Themen