2008-12-29 7 views
5

Ich möchte die aktuelle Zeit und Dateierstellungszeit in Perl vergleichen, aber beide sind in einem anderen Format. Lokalzeit ist in diesem Format:Wie kann ich die Dateierstellungszeit mit der aktuellen Zeit in Perl vergleichen?

22116291110813630 

und Dateierstellungszeit ist

Today, December 29, 2008, 2:38:37 PM 

Wie vergleiche ich, welche größer und deren Unterschied?

+1

Vielleicht von Interesse: http://www.perl.com/doc/manual/html/pod/perlfunc/stat.html – some

+0

Info, wie Daten zu konvertieren: http://www.perl.com /pub/a/2003/03/13/datetime.html – some

+0

Die Antwort auf Ihre Frage lautet: Konvertieren Sie sie in das gleiche Format. Ich schlage vor, "Heute, 29. Dezember 2008" in einen Zeitstempel (Anzahl von (Millisekunden) seit der Epoche) umzuwandeln. Dann ist es ein einfacher Vergleich von zwei Zahlen – some

Antwort

3

localtime gibt eine Liste von Werten im Listenkontext zurück. Siehe the localtime documentation oder perlcheat. In Ihrem Beispiel sieht es aus wie alle, die zusammen musiziert werden. Im skalaren Kontext wird eine formatierte Zeichenfolge wie Mon Dec 29 03:16:33 2008 zurückgegeben. Auf den meisten Plattformen wird die Datei-Inode-Änderungszeit von einer bestimmten Anzahl von Sekunden seit einer bestimmten Epoche von stat zurückgegeben. Sie sollten in der Lage sein, dies direkt mit dem Ergebnis von time() (nichtlocaltime()) zu vergleichen.

13

Wenn Sie Werte vergleichen möchten, könnten Sie die Nummer, die Sie bekam von localtime in Skalarkontext und die Inode-Änderungszeit verwenden möchten, die Sie von stat bekommen:

   ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, 
        $atime,$mtime,$ctime,$blksize,$blocks) 
         = stat($filename); 

wo:

 
       0 dev  device number of filesystem 
       1 ino  inode number 
       2 mode  file mode (type and permissions) 
       3 nlink number of (hard) links to the file 
       4 uid  numeric user ID of file's owner 
       5 gid  numeric group ID of file's owner 
       6 rdev  the device identifier (special files only) 
       7 size  total size of file, in bytes 
       8 atime last access time in seconds since the epoch 
       9 mtime last modify time in seconds since the epoch 
       10 ctime inode change time in seconds since the epoch (*) 
       11 blksize preferred block size for file system I/O 
       12 blocks actual number of blocks allocated 
So

Sie Feld 9:

 

$mtime = (stat $filename)[9]; 
$current_time = time; 

$diff = $current_time - $mtime; 
 
+0

Vielen Dank für die Bereitstellung von Informationen für mich.Ich denke, es gibt den Unterschied in keiner Secs.anyway Danke für Ihre Guide.Advance Frohes neues Jahr –

14

Es ist Noch einfacher als mit stat() und time()/localtime().

my $diff = -M $filename; 

Der Operator -M gibt das "Alter" der Datei (in Tagen seit dem Start des Programms) zurück. Es ist dokumentiert unter der -X functions oder in perldoc -f -X.

+3

Ich weiß, das ist ein alter Thread, aber ich posten eine Antwort trotzdem. -M gibt das "Alter" der letzten Änderung nicht Dateierstellung. -C hätte den korrekten Wert wie gewünscht angegeben, aber ich verwende nur die -X-Funktionen (http://perldoc.perl.org/functions/-X.html) in Einzeilern und verwende den Rest der Zeit. –

0

Diese zwei Funktionen sind dank Jimtuts Antwort. fileage gibt die Anzahl der Sekunden als Ganzzahl aus, die perfekt für die Verwendung in einer Shell einer Datei seit ihrer Erstellung ist. Fileage ist die Antwort auf die obige Frage, während Dataage das gleiche für den Inhalt einer Datei druckt, da dies die Antwort ist, nach der ich gesucht habe. Ich bin sicher, dass diese beiden nützlich sein werden.

function fileage { 
    perl -e 'printf "%i\n", 60 * 60 * 24 * -C "'"${1:?Must provide a file name}"'"' 
} 

function dataage { 
    perl -e 'printf "%i\n", 60 * 60 * 24 * -M "'"${1:?Must provide a file name}"'"' 
}