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, die DateTime Modul von CPAN sehen.
Wie für die Analyse finden Sie in der Date::Parse Modul von CPAN. Wenn Sie wirklich mit Datum analysieren müssen, kann das Date::Manip hilfreich sein, obwohl seine eigene Dokumentation warnt Sie davor, da es eine Menge Gepäck (es kennt Dinge wie gemeinsame Geschäftsreisen, zum Beispiel) und andere Lösungen sind viel schneller.
Wenn Sie etwas über das Format des Datums/der Uhrzeit wissen, die Sie parsen, dann kann ein einfacher regulärer Ausdruck ausreichen, aber Sie sind wahrscheinlich besser dran mit einem geeigneten CPAN-Modul. Wenn Sie beispielsweise wissen, dass die Daten immer in YMDHMS-Reihenfolge vorliegen, 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 weiß, werden immer mit allen oder einem Teil des „HMS“ Teils optional in YMDhms Ordnung sein. Es akzeptiert alle Begrenzer (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 zurück, wenn es nicht analysiert werden konnte (was bedeutet, dass Sie besser sicher sein müssen, dass Sie das Datum 1969 nicht richtig analysieren müssen). 12-31 23:59:59). Es setzt auch zweistellige Jahre voraus XX bis "69" beziehen sich auf "20XX", ansonsten "19XX" (zB bedeutet "50-02-15" 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;
}
Diese Frage hat seltsame Abstimmungen – jdelator
Obligatorischer Vorbehalt: Unix Epoch wird nur für die Jahre 1901 - 2038 definiert. – Piskvor
@Piskvor: Das stimmt nicht genau. Und die Epoche ist definiert als der 1. Januar 1970, nicht eine Reihe. Dies ist jedoch der beste Bereich, den Sie für einen UNIX-Zeitstempel erhalten, wenn Sie ihn in einer 32-Bit-Ganzzahl darstellen (was eine weit verbreitete Konvention ist). –