Конвертировать 12-часовую дату / время в 24-часовую дату / время - PullRequest
10 голосов
/ 13 января 2009

У меня есть файл с разделителями табуляции, где у каждой записи есть поле метки времени в 12-часовом формате:

мм / дд / гггг чч: мм: сс [AM | PM].

Мне нужно быстро преобразовать эти поля в 24-часовое время:

мм / дд / гггг ЧЧ: мм: сс.

Каков наилучший способ сделать это? Я работаю на платформе Windows, но у меня есть доступ к sed, awk, perl, python и tcl в дополнение к обычным инструментам Windows.

Ответы [ 8 ]

12 голосов
/ 13 января 2009

Использование Perl и созданных вручную регулярных выражений вместо таких средств, как 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;
}

Это очень суетно, но также может конвертировать несколько временных отметок на строку.

Обратите внимание, что преобразование AM / PM в 24-часовой формат не является тривиальным.

  • 12: 01 AM -> 00: 01
  • 12: 01 PM -> 12: 01
  • 01: 30 AM -> 01: 30
  • 01: 30 PM -> 13: 30

Сейчас протестировано:

perl ampm-24hr.pl <<!
12/24/2005 12:01:00 AM
09/22/1999 12:00:00 PM
12/12/2005 01:15:00 PM
01/01/2009 01:56:45 AM
12/30/2009 10:00:00 PM
12/30/2009 10:00:00 AM
!

12/24/2005 00:01:00
09/22/1999 12:00:00
12/12/2005 13:15:00
01/01/2009 01:56:45
12/30/2009 22:00:00
12/30/2009 10:00:00

Добавлена ​​

В Что такое простой способ преобразования между временем AM / PM и 24-часовым временем в JavaScript , предоставляется альтернативный алгоритм для преобразования:

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

Всего один тест ... вероятно, аккуратнее.

10 голосов
/ 08 декабря 2010

В Python это вещь из 1 строки:

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

Пример:

>>> 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'
4 голосов
/ 13 января 2009

Используйте модуль даты и времени Pythons примерно так:

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")

Непроверенный код без проверки ошибок. Также он читает весь входной файл в памяти перед запуском. (Я знаю, что есть много возможностей для улучшений, таких как заявление ... Я делаю это вики-сообществом, если кому-то нравится что-то добавлять)

1 голос
/ 23 октября 2009

Чтобы просто преобразовать поле часа, в 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)
0 голосов
/ 19 сентября 2016

В Python: преобразование 12-часового времени в 24-часовое время

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])
0 голосов
/ 10 марта 2009

Здесь я преобразовал 24-часовую систему в 12-часовую систему. Попробуйте использовать этот метод для вашей проблемы.

    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 
0 голосов
/ 13 января 2009

Это может быть слишком простым мышлением, но почему бы не импортировать его в Excel, выбрать весь столбец и изменить формат даты, а затем повторно экспортировать как файл с разделителями табуляции? (Я не проверял это, но это как-то звучит логично для меня:)

0 голосов
/ 13 января 2009

Поскольку у вас несколько языков, я предложу следующий алгоритм.

1 Проверьте временную метку на наличие строки «PM».

2a Если PM не существует, просто преобразуйте метку времени в объект datetime и продолжайте.

2b Если PM существует, преобразуйте метку времени в объект datetime, добавьте 12 часов и продолжайте.

...