Convierta la fecha / hora de 12 horas a la fecha / hora de 24 horas

Tengo un archivo delimitado por tabuladores donde cada registro tiene un campo de marca de tiempo en formato de 12 horas:

mm / dd / aaaa hh: mm: ss [AM | PM].

Necesito convertir rápidamente estos campos a 24 horas:

mm / dd / aaaa HH: mm: ss.

Cuál sería la mejor forma de hacer esto? Estoy ejecutando una plataforma de Windows, pero tengo acceso a sed, awk, perl, python y tcl, además de las herramientas habituales de Windows.

Utilizar Perl y expresiones regulares hechas a mano en lugar de instalaciones como strptime:

#!/bin/perl -w while (<>) { # for date times that don't use leading zeroes, use this regex instead: # (?:\d{1,2}/\d{1,2}/\d{4} )(\d{1,2})(?::\d\d:\d\d) (AM|PM) while (m%(?:\d\d/\d\d/\d{4} )(\d\d)(?::\d\d:\d\d) (AM|PM)%) { my $hh = $1; $hh -= 12 if ($2 eq 'AM' && $hh == 12); $hh += 12 if ($2 eq 'PM' && $hh != 12); $hh = sprintf "%02d", $hh; # for date times that don't use leading zeroes, use this regex instead: # (\d{1,2}/\d{1,2}/\d{4} )(\d{1,2})(:\d\d:\d\d) (?:AM|PM) s%(\d\d/\d\d/\d{4} )(\d\d)(:\d\d:\d\d) (?:AM|PM)%$1$hh$3%; } print; } 

Eso es muy quisquilloso, pero también puede convertir varias marcas de tiempo por línea.

Tenga en cuenta que la transformación de AM / PM a 24 horas no es trivial.

  • 12:01 a.m. -> 00:01
  • 12:01 p.m. -> 12:01
  • 01:30 a.m. -> 01:30
  • 01:30 p.m. -> 13:30

Ahora probado:

 perl ampm-24hr.pl <  

Agregado :

En Qué es una forma sencilla de convertir entre una hora AM / PM y 24 horas en JavaScript , se proporciona un algoritmo alternativo para la conversión:

 $hh = ($1 % 12) + (($2 eq 'AM') ? 0 : 12); 

Solo una prueba ... probablemente más ordenada.

Es una cosa de 1 línea en python:

 time.strftime('%H:%M:%S', time.strptime(x, '%I:%M %p')) 

Ejemplo:

 >>> time.strftime('%H:%M:%S', time.strptime('08:01 AM', '%I:%M %p')) '08:01:00' >>> time.strftime('%H:%M:%S', time.strptime('12:01 AM', '%I:%M %p')) '00:01:00' 

Use el módulo datetime de Pythons de la siguiente manera:

 import datetime infile = open('input.txt') outfile = open('output.txt', 'w') for line in infile.readlines(): d = datetime.strptime(line, "input format string") outfile.write(d.strftime("output format string") 

Código no probado sin comprobación de errores. También lee todo el archivo de entrada en la memoria antes de comenzar. (Sé que hay mucho espacio para mejoras como con la statement … Hago de esto una entrada de wiki de la comunidad si a alguien le gusta agregar algo)

Para convertir el campo de la hora, en python:

 def to12(hour24): return (hour24 % 12) if (hour24 % 12) > 0 else 12 def IsPM(hour24): return hour24 > 11 def to24(hour12, isPm): return (hour12 % 12) + (12 if isPm else 0) def IsPmString(pm): return "PM" if pm else "AM" def TestTo12(): for x in range(24): print x, to12(x), IsPmString(IsPM(x)) def TestTo24(): for pm in [False, True]: print 12, IsPmString(pm), to24(12, pm) for x in range(1, 12): print x, IsPmString(pm), to24(x, pm) 

Esto podría ser un pensamiento demasiado simple, pero ¿por qué no importarlo a Excel, seleccionar toda la columna y cambiar el formato de la fecha, luego volver a exportarlo como un archivo delimitado por tabulaciones? (No probé esto, pero de alguna manera me parece lógico 🙂

Aquí he convertido el sistema de 24 horas al sistema de 12 horas. Intenta usar este método para tu problema.

  DateFormat fmt = new SimpleDateFormat("yyyyMMddHHssmm"); try { Date date =fmt.parse("20090310232344"); System.out.println(date.toString()); fmt = new SimpleDateFormat("dd-MMMM-yyyy hh:mm:ss a "); String dateInString = fmt.format(date); System.out.println(dateInString); } catch (Exception e) { System.out.println(e.getMessage()); } RESULT: Tue Mar 10 23:44:23 IST 2009 10-March-2009 11:44:23 PM 

En Python: Conversión de 12 horas a 24 horas

 import re time1=input().strip().split(':') m=re.search('(..)(..)',time1[2]) sec=m.group(1) tz=m.group(2) if(tz='PM'): time[0]=int(time1[0])+12 if(time1[0]=24): time1[0]-=12 time[2]=sec else: if(int(time1[0])=12): time1[0]-=12 time[2]=sec print(time1[0]+':'+time1[1]+':'+time1[2]) 

Como tiene varios idiomas, sugeriré el siguiente algoritmo.

1 Compruebe la marca de tiempo para la existencia de la cadena “PM”.

2a Si PM no existe, simplemente convierta la marca de tiempo en el objeto datetime y proceda.

2b Si PM existe, convierta la marca de tiempo al objeto datetime, agregue 12 horas y proceda.