Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datetime 将12小时日期/时间转换为24小时日期/时间_Datetime_Text Files - Fatal编程技术网

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

Datetime 将12小时日期/时间转换为24小时日期/时间,datetime,text-files,Datetime,Text Files,我有一个制表符分隔的文件,其中每个记录都有一个12小时格式的时间戳字段: 年月日hh:mm:ss[上午|下午] 我需要快速将这些字段转换为24小时时间: 年月日HH:mm:ss 最好的方法是什么?我在Windows平台上运行,但除了常用的Windows工具外,我还可以访问sed、awk、perl、python和tcl。由于您有多种语言,我建议使用以下算法 1检查时间戳是否存在“PM”字符串 2a如果PM不存在,只需将时间戳转换为datetime对象并继续 2b如果PM确实存在,请将时间戳转换为d

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

年月日hh:mm:ss[上午|下午]

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

年月日HH:mm:ss


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

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

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

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


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

以如下方式使用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条目)

使用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;
}

只有一个测试…可能更整洁。

这可能太简单了,但为什么不将其导入excel,选择整个列并更改日期格式,然后重新导出为以制表符分隔的文件呢?(我没有对此进行测试,但在某种程度上它听起来很合乎逻辑:)

在这里,我将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 

要仅转换小时字段,请在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)
time.strftime('%H:%M:%S', time.strptime(x, '%I:%M %p'))

在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)
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'

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

不准确……计算错误地处理了上午12:01和下午12:01。对我来说,这听起来有点复杂。没有错-只是比较复杂。我的文件中大约有450000多行,我们这里只有Office 2003,所以Excel限制为65K行。对不起,我不熟悉Excel的限制@乔纳森:复杂?真正地我想我们在这个问题上的意见是不同的。编写Perl脚本之类的东西对我来说更复杂:)@Dave Sherohman:你确定吗?它至少必须以上午/下午在场为条件-您不需要在上午时间(如上午10:00)的基础上增加12小时。它似乎也不能解决凌晨12:59比凌晨1:01早两分钟的问题。谢谢乔纳森,工作得很有魅力:)我不得不把正则表达式改成
(?:\d{1,2}/\d{1,2}/\d{4})(\d{1,2})(?:\d\d:\d\d)(AM\124; PM)
,但除此之外,这是“非常挑剔的”第二部分——我想如果有必要的话,你可以解决这个问题。棘手的一点是增加/减少12小时的工作时间;对于那些没有考虑过必要步骤的人来说,错误答案的数量惊人。您也可以使用\d\d?而不是较短的\d{1,2}:DThanks。我决不是一个正则表达式专家;我总是想方设法,直到找到一种有效的方法。