Wie kann ich ein Datum / Zeit umwandeln Zeit (Unix-Zeit / Sekunden seit 1970) in Perl Epoche?
Frage
ein Datum / Zeit als ein Array von (Jahr, Monat, Tag, Stunde, Minute, Sekunde) gegeben, wie würden Sie konvertieren ihm Zeit Epoche, dh die Anzahl der Sekunden seit 1970-01-01 00.00 : 00 GMT
Bonus Frage: Wenn das Datum / Uhrzeit als String gegeben, wie würden Sie zuerst analysieren sie in die (y, m, d, h, m, s) array
Lösung 2
Dies ist der einfachste Weg, die Unix-Zeit zu bekommen:
use Time::Local;
timelocal($second,$minute,$hour,$day,$month-1,$year);
Beachten Sie die umgekehrte Reihenfolge der Argumente und dass der Januar ist Monat 0. Für viele weitere Optionen finden Sie in der Datetime-Modul von CPAN.
Wie für die Analyse finden Sie in der Datum :: Modul von CPAN Parse. Wenn Sie wirklich mit Datum Parsing Phantasie brauchen zu bekommen, die Datum :: Manip hilfreich sein kann, obwohl seine eigene Dokumentation, die Sie weg von ihm warnt, da es viel Gepäck trägt (es weiß Dinge wie gemeinsamer Business-Urlaub, zum Beispiel) und andere Lösungen sind viel schneller.
Wenn Sie geschehen, etwas über das Format des Datums wissen / Zeiten, die Sie dann kann mit einem einfachen regulären Ausdruck Parsen sein werde ausreichen, aber du bist wahrscheinlich besser dran, ein entsprechendes CPAN-Modul. Zum Beispiel, wenn Sie die Daten immer wissen, in YMDhms Reihenfolge sein wird, verwenden Sie das CPAN-Modul Datetime: :. :: Format ISO8601
Für meine eigene Referenz, wenn nichts anderes, unten ist eine Funktion, die ich für eine Anwendung verwenden, wo ich die Daten immer weiß, in YMDhms um optional mit allen oder einem Teil des „HMS“ Teils sein werden. Er akzeptiert keine Trennzeichen (zB „2009-02-15“ oder „2009.02.15“). Es gibt die entsprechende Unix-Zeit (Sekunden seit 1970-01-01 00:00:00 GMT) oder -1, wenn sie es nicht analysieren können (was bedeutet, dass Sie besser sicher, dass Sie nie brauchen, um berechtigterweise das Datum zu analysieren 1969- 12-31 23.59.59). Sie geht auch zweistellige Jahre XX bis zu „69“ beziehen sich auf „20XX“, sonst „19XX“ (zB „50-02-15“ bedeutet 2050.02.15 aber „75-02-15“ bedeutet 1975- 02-15).
use Time::Local;
sub parsedate {
my($s) = @_;
my($year, $month, $day, $hour, $minute, $second);
if($s =~ m{^\s*(\d{1,4})\W*0*(\d{1,2})\W*0*(\d{1,2})\W*0*
(\d{0,2})\W*0*(\d{0,2})\W*0*(\d{0,2})}x) {
$year = $1; $month = $2; $day = $3;
$hour = $4; $minute = $5; $second = $6;
$hour |= 0; $minute |= 0; $second |= 0; # defaults.
$year = ($year<100 ? ($year<70 ? 2000+$year : 1900+$year) : $year);
return timelocal($second,$minute,$hour,$day,$month-1,$year);
}
return -1;
}
Andere Tipps
Wenn Sie mit der Datetime Modul, können Sie die Epoche () Methode auf einem Datetime-Objekt, denn das ist, was denken Sie, wie die Unix-Zeit
Datetime verwenden, können Sie ziemlich leicht von Epoche konvertieren, auf dem neuesten Stand Objekte.
Alternativly, Localtime und gmtime wird eine Epoche in einem Array mit Tag Monat konvertieren und Jahr, und timelocal und timegm von dem Time :: Local-Modul das Gegenteil tun, eine Reihe von Zeitelementen Umwandeln (Sekunden, Minuten, ..., Tage, Monate etc.) in einer Epoche.
ein Datum zu analysieren, schauen Datum :: Parse in CPAN.
$ENV{TZ}="GMT";
POSIX::tzset();
$time = POSIX::mktime($s,$m,$h,$d,$mo-1,$y-1900);
Ich weiß, dass dies eine alte Frage, aber dachte, ich würde eine andere Antwort bieten.
Time::Piece
ist Kern als von Perl 5.9.5
Auf diese Weise können in beliebigen Formaten über die strptime
Methode Parsing der Zeit.
z.
my $t = Time::Piece->strptime("Sunday 3rd Nov, 1943",
"%A %drd %b, %Y");
Der nützliche Teil ist - weil es ein überladenes Objekt ist, können Sie es für numerische Vergleiche verwenden können,
.z.
if ( $t < time() ) { #do something }
Oder wenn Sie es in einem String-Kontext zuzugreifen:
print $t,"\n";
Sie erhalten:
Wed Nov 3 00:00:00 1943
Es gibt eine Reihe von Zugriffsmethoden, die für einige verschiedene andere nützliche zeitbasierte Transformationen erlauben. https://metacpan.org/pod/Time::Piece
Get Datum :: Manip von CPAN , dann:
use Date::Manip;
$string = '18-Sep-2008 20:09'; # or a wide range of other date formats
$unix_time = UnixDate( ParseDate($string), "%s" );
edit:
Datum :: Manip ist groß und langsam, aber sehr flexibel in dem Parsing, und es ist reines Perl. Verwenden Sie es, wenn Sie in Eile sind, wenn Sie Code schreiben, und Sie wissen, dass Sie nicht in Eile sein, wenn Sie es ausführen.
z. Verwenden Sie es, Kommandozeilenoptionen einmal auf Start-up zu analysieren, aber nicht verwendet sie große Mengen von Daten auf einem belebten Webserver Parsen.
Siehe die Autoren Kommentare .
(Danke an den Autor des ersten Kommentars unten)
Mein Lieblingsdatetime-Parser ist Datetime :: Format :: ISO8601 Sobald Sie diese Arbeits haben, werden Sie ein Datetime-Objekt haben, leicht mit Epoche Sekunden Epoche konvertierbar ()
Es gibt viele Datum Manipulation Module auf CPAN. Mein besonderer Favorit ist Datetime und Sie können den strptime Module Daten in beliebigen Formaten zu analysieren. Es gibt auch viele Datetime :: Format Module auf CPAN für spezialisierte Datumsformaten arbeiten, sondern strptime ist das allgemeinste.
Für weitere Referenz, ein Motto, das in angewandt werden kann, beispielsweise !#/bin/sh
Skripte.
EPOCH="`perl -e 'use Time::Local; print timelocal('${SEC}','${MIN}','${HOUR}','${DAY}','${MONTH}','${YEAR}'),\"\n\";'`"
Denken Sie daran, Oktalwerte zu vermeiden!
Möglicherweise eines der besseren Beispiele für ‚Es gibt mehr als einen Weg, es zu tun“, mit oder ohne Hilfe von CPAN.
Wenn Sie die Kontrolle über das, was Sie als ‚Datum / Zeit‘ übergeben bekommen, würde ich vorschlagen, die Datetime Route, entweder durch ein bestimmtes Datum :: Time :: Format Unterklasse, oder mit Datetime :: Format :: strptime, wenn es nicht eine Unterstützung Ihr verrücktes Datumsformates ist (siehe Datetime-FAQ für weitere Details). Im Allgemeinen Datum :: Zeit ist der Weg zu gehen, wenn Sie etwas Ernst mit dem Ergebnis tun: wenige Klassen auf CPAN sind durchaus als anal-retentive und obsessiv genau
.Wenn Sie seltsame Freiform Sachen erwar, werfen Sie es unter Datum :: Parse ‚s str2time () -Methode, which'll Sie erhalten eine-Sekunden seit Epoche Wert, den Sie dann Ihre böse Art und Weise mit, ohne den Overhead von Datum :: Manip .
Ein Filter alle Termine in verschiedenen ISO-bezogenen Formaten konvertieren (und wer etwas anderes nach dem Lesen
Wenn Sie suchen, nur für ein Befehlszeilenprogramm (das heißt, nicht etwas, das von anderen Funktionen aufgerufen werden lassen), dieses Skript ausprobieren. Es nimmt die Existenz von GNU date (präsentiert auf so ziemlich jedes Linux-System): Hier ist, wie es funktioniert: #! /usr/bin/perl -w
use strict;
$_ = (join ' ', @ARGV);
$_ ||= <STDIN>;
chomp;
if (/^[\d.]+$/) {
print scalar localtime $_;
print "\n";
}
else {
exec "date -d '$_' +%s";
}
$ Time now
1221763842
$ Time yesterday
1221677444
$ Time 1221677444
Wed Sep 17 11:50:44 2008
$ Time '12:30pm jan 4 1987'
536790600
$ Time '9am 8 weeks ago'
1216915200