ticks online long human from convert perl datetime parsing date time

perl - online - ticks to date



¿Cómo convierto una fecha/hora en tiempo de época(tiempo Unix/segundos desde 1970) en Perl? (12)

Esta es la forma más sencilla de obtener el tiempo de Unix:

use Time::Local; timelocal($second,$minute,$hour,$day,$month-1,$year);

Tenga en cuenta el orden inverso de los argumentos y que enero es el mes 0. Para muchas más opciones, vea el módulo DateTime de CPAN.

En cuanto al análisis sintáctico, vea el módulo Date::Parse de CPAN. Si realmente necesita hacerse elegante con el análisis de fechas, el Date::Manip puede ser útil, aunque su propia documentación le advierte que no lo permita, ya que lleva mucho equipaje (sabe cosas como días festivos comunes, por ejemplo) y otros las soluciones son mucho mas rapidas

Si sabe algo sobre el formato de la fecha / horas que analizará, una simple expresión regular puede ser suficiente, pero probablemente sea mejor que use un módulo de CPAN apropiado. Por ejemplo, si sabe que las fechas siempre estarán en orden YMDHMS, use el módulo CPAN DateTime::Format::ISO8601 .

Para mi propia referencia, si nada más, a continuación se muestra una función que uso para una aplicación donde sé que las fechas estarán siempre en orden YMDHMS con la totalidad o parte de la parte "HMS" opcional. Acepta cualquier delimitador (p. Ej., "2009-02-15" o "2009.02.15"). Devuelve el tiempo Unix correspondiente (segundos desde 1970-01-01 00:00:00 GMT) o -1 si no pudo analizarlo (lo que significa que es mejor asegurarse de que nunca necesitará legítimamente analizar la fecha 1969- 12-31 23:59:59). También presume que los dos dígitos del año XX hasta "69" se refieren a "20XX", de lo contrario "19XX" (por ejemplo, "50-02-15" significa 2050-02-15 pero "75-02-15" significa 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; }

Dada una fecha / hora como una matriz de (año, mes, día, hora, minuto, segundo), ¿cómo la convertiría a la hora de época, es decir, la cantidad de segundos desde 1970-01-01 00:00:00 GMT ?

Pregunta de bonificación: si se le da la fecha / hora como una cadena, ¿cómo la analizaría primero en la matriz (y, m, d, h, m, s)?


Hay muchos módulos de manipulación de fechas en CPAN. Mi favorito particular es DateTime y puede usar los módulos strptime para analizar las fechas en formatos arbitrarios. También hay muchos módulos DateTime :: Format en CPAN para manejar formatos de fecha especializados, pero strptime es el más genérico.


Mi analizador de fecha y hora favorito es DateTime::Format::ISO8601 Una vez que haya funcionado, tendrá un objeto DateTime, fácilmente convertible a epoch seconds con epoch ()



Para mayor referencia, un trazador de líneas que se puede aplicar, por ejemplo, en los guiones !#/bin/sh .

EPOCH="`perl -e ''use Time::Local; print timelocal(''${SEC}'',''${MIN}'',''${HOUR}'',''${DAY}'',''${MONTH}'',''${YEAR}''),/"/n/";''`"

¡Solo recuerda evitar los valores octales!


Posiblemente uno de los mejores ejemplos de ''Hay más de una forma de hacerlo'', con o sin la ayuda de CPAN.

Si tiene control sobre lo que se pasa como una ''fecha / hora'', le sugiero utilizar la ruta DateTime , ya sea usando una subclase específica Date :: Time :: Format, o usando DateTime :: Format :: Strptime si no hay uno que soporte su formato de fecha extravagante (consulte las preguntas frecuentes sobre la fecha y hora para obtener más detalles). En general, Date :: Time es el camino a seguir si quieres hacer algo serio con el resultado: pocas clases en CPAN son tan retentivas y obsesivamente precisas.

Si esperas cosas extrañas de forma libre, ejecútalo con el método str2time () de Date::Parse , que te dará un valor de segundos después de la época, que luego podrás utilizar de manera perversa, sin la sobrecarga de Date::Manip .


Sé que esta es una vieja pregunta, pero pensé que ofrecería otra respuesta.

Time::Piece is core a partir de Perl 5.9.5

Esto permite analizar el tiempo en formatos arbitrarios mediante el método strptime .

p.ej:

my $t = Time::Piece->strptime("Sunday 3rd Nov, 1943", "%A %drd %b, %Y");

La parte útil es que, como es un objeto sobrecargado, puede usarlo para comparaciones numéricas.

p.ej

if ( $t < time() ) { #do something }

O si accede a él en un contexto de cadena:

print $t,"/n";

Usted obtiene:

Wed Nov 3 00:00:00 1943

Hay una gran cantidad de métodos de acceso que permiten algunas otras transformaciones útiles basadas en el tiempo. Time::Piece


Si está utilizando el módulo DateTime , puede llamar al método epoch() en un objeto DateTime, ya que eso es lo que usted considera como tiempo Unix.

Usar DateTimes te permite convertir bastante fácilmente objetos de época, hasta la fecha.

Alternativamente, localtime y gmtime convertirán una época en una matriz que contiene día mes y año, y timelocal y timegm desde el módulo Time :: Local harán lo contrario, convirtiendo una matriz de elementos de tiempo (segundos, minutos, ..., días , meses, etc.) en una época.


Si solo está buscando una utilidad de línea de comandos (es decir, no algo que reciba llamadas de otras funciones), pruebe esta secuencia de comandos. Asume la existencia de la fecha GNU (presente en prácticamente cualquier sistema Linux):

#! /usr/bin/perl -w use strict; $_ = (join '' '', @ARGV); $_ ||= <STDIN>; chomp; if (/^[/d.]+$/) { print scalar localtime $_; print "/n"; } else { exec "date -d ''$_'' +%s"; }

Así es como funciona:

$ 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


Un filtro que convierte cualquier fecha en varios formatos relacionados con ISO (¿y quién utilizaría algo más después de leer las escrituras de Mighty Kuhn?) En la entrada estándar a segundos en la salida estándar podría servir para ilustrar ambas partes :

martind@whitewater:~$ cat `which isoToEpoch` #!/usr/bin/perl -w use strict; use Time::Piece; # sudo apt-get install libtime-piece-perl while (<>) { # date --iso=s: # 2007-02-15T18:25:42-0800 # Other matched formats: # 2007-02-15 13:50:29 (UTC-0800) # 2007-02-15 13:50:29 (UTC-08:00) s/(/d{4}-/d{2}-/d{2}([T ])/d{2}:/d{2}:/d{2})(?:/./d+)? ?(?:/(UTC)?([+/-]/d{2})?:?00/)?/Time::Piece->strptime ($1, "%Y-%m-%d$2%H:%M:%S")->epoch - (defined ($3) ? $3 * 3600 : 0)/eg; print; } martind@whitewater:~$


Obtenga Date :: Manip de CPAN , luego:

use Date::Manip; $string = ''18-Sep-2008 20:09''; # or a wide range of other date formats $unix_time = UnixDate( ParseDate($string), "%s" );

editar:

Date :: Manip es grande y lento, pero muy flexible en el análisis, y es puro perl. Úselo si tiene prisa cuando escribe código y sabe que no tendrá prisa cuando lo esté ejecutando.

Por ejemplo, utilícelo para analizar las opciones de línea de comando una vez en la puesta en marcha, pero no lo use analizando grandes cantidades de datos en un servidor web ocupado.

Ver los comentarios de los autores .

(Gracias al autor del primer comentario a continuación)


$ENV{TZ}="GMT"; POSIX::tzset(); $time = POSIX::mktime($s,$m,$h,$d,$mo-1,$y-1900);