Wie kann ich ein Datum / Zeit umwandeln Zeit (Unix-Zeit / Sekunden seit 1970) in Perl Epoche?

StackOverflow https://stackoverflow.com/questions/95492

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

War es hilfreich?

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 .

scroll top