关于日期时间:将12小时日期/时间转换为24小时日期/时间

Convert 12-hour date/time to 24-hour date/time

我有一个以制表符分隔的文件,其中每个记录都有一个12小时格式的时间戳字段:

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

我需要快速将这些字段转换为24小时时间:

mm/dd/yyyy HH:mm:ss.

最好的方法是什么?我在Windows平台上运行,但是除了通常的Windows工具外,我还可以访问sed、awk、perl、python和tcl。


使用Perl和手工制作的regex,而不是strptime这样的工具:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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——>00:01
  • 下午12:01——>12:01
  • 上午01:30——>01:30
  • 下午1:30——>13:30

现在测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

补充:

在javascript中,在AM/PM时间和24小时时间之间转换的一种简单方法是,为转换提供了另一种算法:

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

只是一个测试…可能更干净。


在python中,这是一个1行代码:

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

例子:

1
2
3
4
>>> 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'


像这样使用pythons datetime模块:

1
2
3
4
5
6
7
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")

未测试的代码,没有错误检查。另外,它在启动前读取内存中的整个输入文件。(我知道有很多地方需要改进,比如说语句……如果有人喜欢添加内容,我会将其作为社区wiki条目)


只需转换小时字段,在python中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)

在python中:将12小时时间转换为24小时时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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])

我把24小时制改成12小时制。试着用这个方法解决你的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    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


这可能太简单了,但为什么不将其导入Excel,选择整个列并更改日期格式,然后以制表符分隔的文件重新导出?(我没有测试这个,但在我看来这听起来很合理。)


由于您有多种语言,我建议使用以下算法。

1检查时间戳是否存在"pm"字符串。

2a如果pm不存在,只需将时间戳转换为datetime对象并继续。

2b如果pm确实存在,将时间戳转换为datetime对象,添加12小时,然后继续。