datetime.strptime(“2017-01-12T14:12:06.000-0500”,'%Y-%间 - %的dT%H:%M:%S%F%Z')

时间:2017-01-16 21:06:52

标签: python python-2.7 datetime strptime python-datetime

我一直在尝试将此特定日期格式转换为Python中的字符串,如下所示:

datetime.strptime(‘2017-01-12T14:12:06.000-0500’,'%Y-%m-%dT%H:%M:%S.%f%Z')

但它不起作用。

我做错了什么?

7 个答案:

答案 0 :(得分:8)

错误在于您使用的是%Z而不是%z。从documentation开始,您应该使用%z来匹配,例如(empty), +0000, -0400, +1030

import datetime

result = datetime.datetime.strptime('2017-01-12T14:12:06.000-0500','%Y-%m-%dT%H:%M:%S.%f%z')

print(result)

<强>输出

2017-01-12 14:12:06-05:00

答案 1 :(得分:3)

<强>任务:

“将此特定日期格式转换为Python中的字符串”

import datetime  

<强>解决方案:

首先修改您的datetime.strptime代码,如下所示:

  obj = datetime.datetime.strptime('2017-01-12T14:12:06.000-0500','%Y-%m-%dT%H:%M:%S.%f%z')

This是一个有用的网站供您参考,可以帮助您根据自己的喜好修改输出。

然后使用strftime将其转换为字符串:

obj.strftime("%b %d %Y %H:%M:%S")

输出:

'Jan 12 2017 14:12:06'

答案 2 :(得分:2)

假设Python 3,格式%f可能不是您平台上strptime的有效格式字符。格式的strptime docs参考strftime%f不在the strftime list。但是,format string reference表示

  

支持的全套格式代码因平台而异,因为Python调用平台C库的strftime()函数,并且平台变体很常见。

在我的测试系统上,这是Cygwin和Py 3.4.5,我用过:

import datetime
datetime.datetime.strptime('2017-01-12T14:12:06.000-0500','%Y-%m-%dT%H:%M:%S.%f%Z')

得到了

ValueError: time data '2017-01-12T14:12:06.000-0500' does not match format '%Y-%m-%dT%H:%M:%S.%f%Z'

我查看了strftime(3)的手册页,发现我没有%f,而%z应该是小写的。因此我用了

datetime.datetime.strptime('2017-01-12T14:12:06.000-0500','%Y-%m-%dT%H:%M:%S.000%z')
#          straight quotes ^ not curly                  ^
#                                                      literal .000 (no %f) ^^^^ 
#                                                                  lowercase %z ^^

并获得了成功的解析。

编辑 @Tagc在Windows 10计算机上的PyCharm中发现%f在Python 3.5下正常运行。

答案 3 :(得分:2)

Python 2.7

的解决方案

从评论中可以看出,OP需要一个Python 2.7的解决方案。

显然,对于python 2.7,strptime中没有%z,即使the documentation claims the contrary,引发的错误是ValueError: 'z' is a bad directive in format '%Y-%m-%dT%H:%M:%S.000%z'

要解决此问题,您需要先解析没有时区的日期,然后再添加时区。不幸的是,您需要为此tzinfo创建子类。此答案基于this answer

from datetime import datetime, timedelta, tzinfo

class FixedOffset(tzinfo):
    """offset_str: Fixed offset in str: e.g. '-0400'"""
    def __init__(self, offset_str):
        sign, hours, minutes = offset_str[0], offset_str[1:3], offset_str[3:]
        offset = (int(hours) * 60 + int(minutes)) * (-1 if sign == "-" else 1)
        self.__offset = timedelta(minutes=offset)
        # NOTE: the last part is to remind about deprecated POSIX GMT+h timezones
        # that have the opposite sign in the name;
        # the corresponding numeric value is not used e.g., no minutes
        '<%+03d%02d>%+d' % (int(hours), int(minutes), int(hours)*-1)
    def utcoffset(self, dt=None):
        return self.__offset
    def tzname(self, dt=None):
        return self.__name
    def dst(self, dt=None):
        return timedelta(0)
    def __repr__(self):
        return 'FixedOffset(%d)' % (self.utcoffset().total_seconds() / 60)

date_with_tz = "2017-01-12T14:12:06.000-0500"
date_str, tz = date_with_tz[:-5], date_with_tz[-5:]
dt_utc = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S.%f")
dt = dt_utc.replace(tzinfo=FixedOffset(tz))
print(dt)

最后一行打印:

2017-01-12 14:12:06-05:00

答案 4 :(得分:1)

将日期作为输入str:

git

python-transforming-twitter

答案 5 :(得分:1)

如果您没有时区信息,请在Python 3中将“%Z”替换为“ Z”。

datetime.strptime('2010-10-04T03:41:22.858Z','%Y-%m-%dT%H:%M:%S.%fZ')
# datetime.datetime(2010, 10, 4, 3, 41, 22, 858000)

答案 6 :(得分:0)

如果是字符串,例如从JSON文件加载,您可以尝试

date = '2017-01-12T14:12:06.000-0500'

print(date = date[:10]+" "+date[11:19])

返回:

2017-01-12 14:12:06