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小时,然后继续。