• Publicidad

Cómo convertir una fecha(yy-mm-dd hh-mm-ss) a sólo segundos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Cómo convertir una fecha(yy-mm-dd hh-mm-ss) a sólo segundos

Notapor victorhugo » 2011-05-16 09:21 @431

Buen día a todos los perleros.

Hoy se me presentó un problema. He estado realizando una resta de fechas con Date::Manip y delta_format(), pero con el formato más completo de fechas GMT.

Sucede que sí la realizo y luego ese resultado lo sumo, pero muestra días y horas incorrectos. Así que decidí realizar las sumas y restas solo en segundos y luego convertirlos en fechas y tiempos. Pero no sé cómo.

Voy a dejar el ejemplo de cómo lo he realizado normal.

print "$tiempos[1]\n";
print "$tiempos[0]\n";
$diferencia = DateCalc("$tiempos[0]", "$tiempos[1]",);
$dias = Delta_Format($diferencia,2,"%hv:%mv:%sv");
$totaltime[$t]=$dias;
$t=$t+1;
print "$tiempos[1]\n";
print "$tiempos[2]\n";

$diferencia = DateCalc("$tiempos[1]", "$tiempos[2]",);
$dias = Delta_Format($diferencia,2,"%hv:%mv:%sv");
$totaltime[$t]=$dias;

print"$totaltime[1]\n";
print"$totaltime[0]\n";

$add_reps= DateCalc( $totaltime[0], + $totaltime[1]);
$suma_reps= Delta_Format($add_reps,2,"%hv:%mv:%sv");
print"$suma_reps\n";

Gracias, espero su ayuda.
VHMR
victorhugo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-05-04 10:01 @459

Publicidad

Re: Cómo convertir una fecha(yy-mm-dd hh-mm-ss) a sólo segundos

Notapor explorer » 2011-05-16 10:44 @489

Una forma de hacerlo sería usando las funciones que ofrece Time::Local

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Modern::Perl;                       # somos modernos
  3.  
  4. use Time::Local;
  5.  
  6. #            0  1  2  3  4  5
  7. #            yy-mm-dd HH-MM-SS
  8. my $fecha = '11-05-16 17-36-18';        # una fecha de ejemplo
  9.  
  10. my @tiempo = $fecha =~ /(\d+)/g;        # sacamos todos los campos
  11.  
  12. $tiempo[1]--;                           # ajuste de meses, para Time::Local
  13.  
  14. #                                       # conversión a segundos GMT
  15. #                         SS,MM,HH,dd,mm,yy
  16. my $time = timegm(@tiempo[ 5, 4, 3, 2, 1, 0]);
  17.  
  18.  
  19. say scalar gmtime $time;                # comprobación
  20.  
  21. __END__
  22. Mon May 16 17:36:18 2011
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

De todas maneras, se aconseja siempre usar las facilidades de la familia DateTime, para realizar operaciones con fechas. En estos hilos hay algunos ejemplos de sumas, restas, diferencias, días laborables y festivos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo convertir una fecha(yy-mm-dd hh-mm-ss) a sólo segundos

Notapor victorhugo » 2011-05-16 13:52 @619

Gracias, es buena esa opción, aunque encontré esta forma de hacerla sin convertir nada.

Ya teniendo las dos fechas en el formato GMT logré hacer esto:

$add_reps= DateCalc( $totaltime[0], + $totaltime[1]);
$suma_reps= Delta_Format($add_reps,2,"%hv:%mv:%sv");
print"$suma_reps\n";

y muestra todo ordenado, que sucede que muestra un día que no es ni la hora más si muestra bien la suma de segundos y minutos.

2011-04-27 13:51:12 tiempo[1]
2011-04-27 13:50:03 tiempo[0]
2011-04-27 13:50:12 tiempo[1]
2011-04-27 14:02:27 tiempo[2]
0:11:15 totaltime(tiempo[2].tiempo[1])
0:1:9 totaltime(tiempo[1,tiempo[0])
suma total
16:12:24

Me di cuenta de que toma la fecha actual de la computadora:

suma total
2011051600:12:24

si imprimo add_reps. no sé por qué toma esa fecha. Debería tomar las fechas que se indican. Gracias nuevamente.
VHMR
victorhugo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-05-04 10:01 @459

Re: Cómo convertir una fecha(yy-mm-dd hh-mm-ss) a sólo segundos

Notapor explorer » 2011-05-16 14:43 @655

Quizás el problema esté en el orden de cálculo de las diferencias... A mí sí que me sale bien:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Modern::Perl;                       # somos modernos
  3.  
  4. use Date::Manip;
  5.  
  6. my $datestr1 = "2011-04-27 13:51:12";
  7. my $datestr2 = "2011-04-27 13:50:03";
  8.  
  9. my $date1 = ParseDate($datestr1);
  10. my $date2 = ParseDate($datestr2);
  11.  
  12. my $delta1 = DateCalc($date2,$date1);   # $date1 - $date2
  13.  
  14. say $datestr1;
  15. say $datestr2;
  16.  
  17. say ' ' x 11, Delta_Format($delta1,"%02hv:%02mv:%02sv");
  18.  
  19.  
  20. $datestr1 = "2011-04-27 14:02:27";
  21. $datestr2 = "2011-04-27 13:50:12";
  22.  
  23. $date1 = ParseDate($datestr1);
  24. $date2 = ParseDate($datestr2);
  25.  
  26. my $delta2 = DateCalc($date2,$date1);   # $date1 - $date2
  27.  
  28. say $datestr1;
  29. say $datestr2;
  30.  
  31. say ' ' x 11, Delta_Format($delta2,"%02hv:%02mv:%02sv");
  32.  
  33. my $total = DateCalc($delta1, $delta2); # suma de deltas
  34.  
  35. say '-' x 20;
  36.  
  37. say ' ' x 11, Delta_Format($total,"%02hv:%02mv:%02sv");
  38.  
  39. __END__
  40. 2011-04-27 13:51:12
  41. 2011-04-27 13:50:03
  42.            00:01:09
  43. 2011-04-27 14:02:27
  44. 2011-04-27 13:50:12
  45.            00:12:15
  46. --------------------
  47.            00:13:24
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo convertir una fecha(yy-mm-dd hh-mm-ss) a sólo segundos

Notapor victorhugo » 2011-05-17 09:08 @422

Gracias por la respuesta amigo.

El inconveniente es que no sé qué es say() debido a que al correr el programa menciona error en ese say().

Mi problema está en la suma. No sé por qué pero no me da el valor.

Comentando el delta_format,

$add_reps= DateCalc($totaltime[0], + $totaltime[1]);
#$suma_reps= Delta_Format($add_reps,2,"%hv:%mv:%sv");
print"$add_reps\n";

2011051700:12:24, toma la fecha del sistema o de la computadora. Pero no debería y sin comentar el delta_fomat muestra la suma pero si coloco la hora muestra esto:

20:12:24.

¿Qué error estaré cometiendo?

Muchas gracias por las repuestas.
Feliz día
VHMR
victorhugo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-05-04 10:01 @459

Re: Cómo convertir una fecha(yy-mm-dd hh-mm-ss) a sólo segundos

Notapor explorer » 2011-05-17 09:17 @428

say() es un print() con un "\n" al final.

say() se importa desde la línea 'use Modern::Perl;'.

En cuanto a lo que estás haciendo, sería conveniente que publicaras el código de un programa entero en donde salga este error o muestres lo que quieres hacer, es decir, además de las líneas que has publicado en el primer mensaje, poner las líneas donde inicializas @tiempos.

Vamos, poner un programa pequeño, pero completo, donde se muestre la salida errónea, y nos dices además, qué salida es la que esperas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo convertir una fecha(yy-mm-dd hh-mm-ss) a sólo segundos

Notapor victorhugo » 2011-05-30 14:36 @650

Buen día.

Ha surgido una curiosidad con el DateCalc(): SU FUNCIÓN es tanto para sumar y restar, pero ¿cómo saber qué hace y cómo? Ya he revisado el módulo en CPAN pero no encuentro algo que lo defina. Es decir, en un momento él resta uno de los valores y en otro, suma, pero ¿cómo sé en cuál? Aunque hace la operación no veo diferencia en la aplicación ejemplo.

my $delta1 = DateCalc($date2,$date1); # resta

my $total = DateCalc($delta1, $delta2); # suma de deltas
VHMR
victorhugo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-05-04 10:01 @459

Re: Cómo convertir una fecha(yy-mm-dd hh-mm-ss) a sólo segundos

Notapor explorer » 2011-05-30 14:56 @664

La función DateCalc() está definida en Date::Manip::DM6, pero deja la explicación de las distintas operaciones matemáticas para el módulo Date::Manip::Calc.

Hay tres tipos de cálculos:

Cálculos fecha/fecha: el resultado es

$delta = $fecha2 - fecha1;

Si el tercer parámetro de la función es distinto de cero, el resultado es

$delta = $fecha1 - fecha2;

Cálculos delta/delta:

$fecha2 = $fecha1 + $delta;

Si el tercer parámetro de la función es distinto de cero, el resultado es

$fecha2 = $fecha1 - $delta;

Cálculos delta/delta:

$delta3 = $delta1 + $delta2;

Si el tercer parámetro de la función es distinto de cero, el resultado es

$delta3 = $delta1 - $delta2;
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo convertir una fecha(yy-mm-dd hh-mm-ss) a sólo segundos

Notapor luisjf » 2011-05-31 08:18 @387

Hola, buena tardes. Yo también necesito dar uso a esa función y tengo la misma duda. En estos diferentes casos, ¿cuál representa el tercer parámetro? ¿Y qué representa "delta"? ¿Es el resultado de una resta previa?
personal: debian 6 (squeeze) with perl v5.10.1
laboral: canaima 3 with perl v5.10.1
Avatar de Usuario
luisjf
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-05-11 17:57 @790

Re: Cómo convertir una fecha(yy-mm-dd hh-mm-ss) a sólo segundos

Notapor explorer » 2011-05-31 13:56 @622

El tercer parámetro es el tercer (opcional) argumento que se le pasa a DateCalc. Más información en los enlaces indicados antes.

'delta' es un periodo de tiempo, no una fecha ni una hora, sino un lapso, una duración.

Repito que es más cómodo usar los módulos de DateTime, que Date::Manip.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 32 invitados