Converter data / hora de 12 horas em data / hora de 24 horas

Eu tenho um arquivo delimitado por tabulação, onde cada registro tem um campo de carimbo de hora no formato de 12 horas:

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

Eu preciso converter rapidamente esses campos para 24 horas:

mm / dd / aaaa HH: mm: ss.

Qual seria a melhor forma de fazer isso? Estou executando em uma plataforma Windows, mas tenho access a sed, awk, perl, python e tcl, além das ferramentas usuais do Windows.

Usando o Perl e regexes feitos à mão em vez de resources como o 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; } 

Isso é muito exigente – mas também converte vários timestamps por linha.

Observe que a transformação de AM / PM para 24 horas não é trivial.

  • 12:01 -> 00:01
  • 12:01 -> 12:01
  • 01:30 – 01:30
  • 13:30 -> 13:30

Agora testado:

 perl ampm-24hr.pl < 

Adicionado :

Em O que é uma maneira simples de converter entre um horário AM / PM e um horário de 24 horas em JavaScript , um algoritmo alternativo é fornecido para a conversão:

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

Apenas um teste ... provavelmente mais puro.

É uma coisa de uma linha em python:

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

Exemplo:

 >>> 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 Pythons datetime module alguma maneira assim:

 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 não testado sem verificação de erros. Também lê todo o arquivo de input na memory antes de iniciar. (Eu sei que há muito espaço para melhorias como com a instrução … Eu faço disso uma input wiki da comunidade se alguém quiser adicionar algo)

Para apenas converter o campo hora, em 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) 

Isso pode ser um raciocínio muito simples, mas por que não importá-lo para o Excel, selecione a coluna inteira e altere o formato de data e, em seguida, exporte novamente como um arquivo delimitado por tabulações? (Eu não testei isso, mas de alguma forma parece lógico para mim 🙂

Aqui eu converti o sistema de 24 horas para o sistema de 12 horas. Tente usar esse método para o seu 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 

Em Python: Conversão de 12 horas para 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 você tem vários idiomas, sugiro o seguinte algoritmo.

1 Verifique o timestamp para a existência da string “PM”.

2a Se o PM não existir, simplesmente converta o timestamp no object datetime e prossiga.

2b Se o PM existir, converta o timestamp no object datetime, adicione 12 horas e continue.

Intereting Posts