2008-12-29 22 views
5

quiero comparar la hora actual y la hora de creación de archivos en Perl, pero ambas están en diferentes formatos. localtime es en este formato: tiempo de creación¿Cómo puedo comparar la hora de creación del archivo con la hora actual en Perl?

22116291110813630 

y el archivo es

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

¿Cómo comparo los cuales uno es mayor y su diferencia?

+1

quizás te interesen: http://www.perl.com/doc/manual/html/pod/perlfunc/stat.html – some

+0

información de cómo convertir fechas: http://www.perl.com /pub/a/2003/03/13/datetime.html – some

+0

La respuesta a su pregunta es: convertirlos al mismo formato. Sugiero convertir "Hoy, 29 de diciembre de 2008" a una marca de tiempo (número de (milli) segundos desde la época). Entonces, es una comparación simple de dos números – some

Respuesta

3

localtime devuelve una lista de valores en el contexto de la lista. Ver the localtime documentation o perlcheat. En tu ejemplo, parece que todos están mezclados. En contexto escalar, devuelve una cadena formateada como Mon Dec 29 03:16:33 2008. En la mayoría de las plataformas, el tiempo de cambio del inodo del archivo se devolverá desde stat como un número de segundos desde algún momento. Debería poder compararlo directamente con el resultado de time() (nolocaltime()).

13

Si desea comparar los valores, es posible que desee utilizar el número que obtuvo de localtime en contexto escalar y el tiempo de cambio de nodo-i que se puede obtener a partir stat:

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

donde:

 
       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 

Así que quieres campo 9:

 

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

$diff = $current_time - $mtime; 
 
+0

Gracias por darme información. Creo que está dando el diff en no de secs.anyway gracias por su guía. Avanza feliz año nuevo –

14

es incluso más fácil que usar stat() y time()/localtime().

my $diff = -M $filename; 

El operador -M devuelve la "edad" del archivo (en días desde el inicio del programa). Está documentado en -X functions o en perldoc -f -X.

+3

Sé que este es un hilo viejo pero de todos modos estoy publicando una respuesta. -M da la "edad" de la última modificación, no la creación de archivos. -C hubiera dado el valor correcto según lo solicitado pero solo uso las funciones -X (http://perldoc.perl.org/functions/-X.html) en líneas simples y uso stat el resto del tiempo. –

0

Estas dos funciones son gracias a la respuesta de jimtut. fileage imprime la cantidad de segundos como un entero, perfecto para el uso en un shell, de un archivo desde el momento de su creación. el archivo es la respuesta a la pregunta anterior, mientras que el dataage imprime lo mismo para el contenido de un archivo, ya que esa es la respuesta que estaba buscando. Estoy seguro de que ambos serán útiles.

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}"'"' 
} 
Cuestiones relacionadas