代码之家  ›  专栏  ›  技术社区  ›  Patrick Cuff

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

  •  10
  • Patrick Cuff  · 技术社区  · 15 年前

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

    年/月/日hh:mm:ss[am pm]。

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

    年/月/日hh:mm:ss。

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

    8 回复  |  直到 8 年前
        1
  •  12
  •   Community Paul Sweatte    7 年前

    使用Perl和手工制作的regex,而不是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-->00:01
    • 下午12:01-->12:01
    • 上午01:30-->01:30
    • 下午1:30-->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
    

    补充 :

    What is a Simple Way to Convert Between an AM/PM Time and 24 hour Time in JavaScript ,为转换提供了另一种算法:

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

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

        2
  •  10
  •   fedorqui yar    9 年前

    在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'
    
        3
  •  4
  •   community wiki Martin Thurau    15 年前

    像这样使用pythons datetime模块:

    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条目)

        4
  •  1
  •   Erik    15 年前

    只需转换小时字段,在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)
    
        5
  •  0
  •   Dave    15 年前

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

        6
  •  0
  •   Harshana Eranga Martin    15 年前

    我把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 
    
        7
  •  0
  •   Harsh Seth    8 年前

    在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])
    
        8
  •  -1
  •   Dillie-O    15 年前

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

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

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

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