【问题标题】:Parsing date and timestamps in Python with time.strptime format使用 time.strptime 格式在 Python 中解析日期和时间戳
【发布时间】:2012-05-05 02:19:31
【问题描述】:

我的云服务器以这种格式记录时间:

[17/Dec/2011:09:48:49 -0600]

要将其读入 Python 变量,我可以说:

>>>str = '17/Dec/2011:09:48:49 -0600'
>>>import time
>>>print  time.strptime(str,"%d/%b/%Y:%H:%M:%S -0600")

结果:

time.struct_time(tm_year=2011, tm-mon=12, tm=mday=17, tm_hour=9, tm_min=48, tm_sec=49, tm_wday=5, tm_yday=351, tm_isdst=-1)

或者我可以试试

>>>mytime = time.strptime(str,"%d/%b/%Y:%H:%M:%S -0600")
>>>print mytime.tm_hour

结果:

9

-0600 有什么作用?我希望它调整日期时间对象中的小时值?是否可以使用通配符来代替对-0600 进行硬编码?

【问题讨论】:

    标签: python time timezone strptime


    【解决方案1】:

    -0600 是与格林威治标准时间 (GMT) 的偏移量。与another SO question already says 一样,time.strptime 无法读取时区偏移量,但datetime.strftime 可以生成它们。

    正如the datetime module's documentation 开头所解释的,在python 中有两种接近“时间”的方法,天真或有意识。如果您只关心系统中的时间,那么处理简单的时间/日期时间对象就可以了(在这种情况下,您可以按照艾伦的建议去除偏移量)。当您需要将系统内部的值与现实世界的时间概念进行比较时,您必须开始处理该偏移量。

    处理这个问题的简单方法就是use python-dateutil。它有一个parse function,它将尽最大努力将您传入的日期字符串模糊匹配为多种格式,并返回一个可行的日期时间实例,该实例代表它对您的意思的最佳猜测。

    >>> from dateutil.parser import parse
    >>> parse('17/Dec/2011:09:48:49 -0600', fuzzy=True)
    datetime.datetime(2011, 12, 17, 9, 48, 49, tzinfo=tzoffset(None, -21600))
    

    通常,让软件给出“最佳猜测”是一件坏事。在这种情况下,您的输入格式是否稳定似乎是合理的。处理软件开发的时间很难,去购物吧。

    【讨论】:

    • 我正在查看 python-dateutil。没有意识到它的目的。
    【解决方案2】:

    这是与 GMT 的偏移量。如果您不想要它,只需将其剥离:

    >>> import time
    >>> line = '17/Dec/2011:09:48:49 -0600'
    >>> line = line.split(' ')[0]
    >>> print  time.strptime(line,"%d/%b/%Y:%H:%M:%S")
    time.struct_time(tm_year=2011, tm_mon=12, tm_mday=17, tm_hour=9, tm_min=48,  tm_sec=49, tm_wday=5, tm_yday=351, tm_isdst=-1)
    

    【讨论】:

    • 我喜欢你分割日期并将第一个索引全部放在一行中的方式
    • 它也适用于正则表达式:newdate = re.split(" ", myStr)[0]
    【解决方案3】:

    strptime 只是将修饰符 (%d,%b, ...) 与字符串的相应段匹配,然后将匹配的字符串转换为整数。因此,在您的情况下,-0600 只会使您的格式字符串与输入字符串匹配。

    如果您想通过指定的偏移量调整时间,我建议使用datetime 对象。

    >>>s = '17/Dec/2011:09:48:49 -0600'
    >>>from datetime import datetime,timedelta
    >>>mytime = datetime.strptime(s,"%d/%b/%Y:%H:%M:%S -0600")
    >>>dt = timedelta(minutes=6*60)  #6 hours
    >>>mytime-=dt
    >>>print mytime
    2011-12-17 03:48:49
    >>>print mytime.hour
    3
    

    还请注意,由于str 是内置函数,因此通常不建议重新分配它。

    【讨论】:

    • 哦,感谢您指出使用 str 作为变量名。坏习惯!
    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 2018-06-20
    • 2015-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多