2016-07-01 7 views
0

Ich brauche die folgenden Zeichenfolgen in DateTime Objekte zu konvertieren, damit ich sie vergleichen kann:Wie kann ich zwei Datumsangaben mit unterschiedlichen Formaten in DateTime-Objekte konvertieren, damit ich sie vergleichen kann?

2016-06-30T09:00:00-04:00 
2016-07-01T15:37:25 

Beide Objekte die EST Zeitzone verwenden. Wie kann ich das machen?

+1

Sie meinen, Sie die Zeitzone entfernen möchten versetzt? ('-04: 00' in Ihrer ersten Saite) – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot Ja, eigentlich muss ich das entfernen (-4.00) und das" 2016-06-30T09: 00: 00-04: 00 "vom Typ string und ich muss In DateTime-Objekt konvertieren! – user3784251

+0

Welche Zeitzone sollte das DateTime-Objekt verwenden? – ThisSuitIsBlackNot

Antwort

2

Zuerst wird EST verwendet, um sich auf eine Vielzahl von verschiedenen Zeitzonenoffsets zu beziehen. Vermutlich meintest du UTC-05:00.

Zweitens, wenn man Datetime-Arithmetik durchführen will, möchte man selten mit Offsets umgehen; man möchte fast immer Zeitzonen, die mit einem geografischen Ort verbunden sind (wie America/New_York). America/New_York wäre eine geeignete Wahl für den Einsatz unten, aber ich habe stattdessen die flexiblere local verwendet.

use strict; 
use warnings; 
use feature qw(say); 

use DateTime::Format::Strptime qw(); 

my $format1 = DateTime::Format::Strptime->new(
    pattern => "%Y-%m-%dT%H:%M:%S%Z", 
    on_error => "croak", 
); 

my $format2 = DateTime::Format::Strptime->new(
    pattern => "%Y-%m-%dT%H:%M:%S", 
    time_zone => "local", 
    on_error => "croak", 
); 

my $dt1 = $format1->parse_datetime('2016-06-30T09:00:00-04:00'); 
my $dt2 = $format2->parse_datetime('2016-07-01T15:37:25'); 

Dann können Sie tun, was Sie wollen. Sie erwähnten, dass Sie sie vergleichen wollten, was mit numerischen Vergleichsoperatoren geschehen kann (z. B. $dt1 < $dt2).

Das folgende Beispiel wandelt die Zeitstempel in RFC3339 Zeitstempel (der Zeitstempel-Format von Internet-Standards verwendet wird):

$dt1->set_time_zone("UTC"); 
say "dt1: " . $dt1->strftime("%Y-%m-%dT%H:%M:%SZ"); 

$dt2->set_time_zone("UTC"); 
say "dt2: " . $dt2->strftime("%Y-%m-%dT%H:%M:%SZ"); 
+0

Dies gibt einen Fehler wie "Ich erkenne die Zeitzone 8. bei trydate.pl Zeile 21." wenn es einen anderen Wert als 00 in Sekunden gibt, zB: 2016-07-01T16: 32: 08-04: 00. Warum ist es so? Wie verwerfen Sie diesen Fehler? – user3784251

+0

Nein, '$ format1-> parse_datetime ('2016-07-01T16: 32: 08-04: 00')' erzeugt keinen Fehler. Ich glaube nicht, dass du das tatsächlich bestanden hast. – ikegami

+0

'my $ format1 = DatumZeit :: Format :: Strptime-> neu ( Muster =>"% Y-% m-% dT% H:% M:% S% Z ", on_error =>" krächzen ", ); mein $ dt1 = $ format1-> parse_datetime ('2016-07-01T16: 32: 08-04: 00'); $ dt1-> set_time_zone ("EST"); drucken "dt1: 2016-07-01T16: 32: 08-04: 00". $ dt1-> strftime ("% Y-% m-% dT% H:% M:% SZ"). "\ n \ n"; " – user3784251

Verwandte Themen