如何将从Facebook Graph检索到的时间解析为12小时格式?

时间:2017-06-25 09:47:50

标签: python facebook time python-dateutil

当我从Facebook Graph中拉出事件开始时间时会出现以下形式:

2017-09-26T18:00:00+0300

我想将其转换为可读格式,所以我使用它:

readable_event_date = dateutil.parser.parse(event_date).strftime('%a, %b %d %Y %H:%M:%S')

它出现了这样:

Tue, 26 Sep 2017 18:00:00

哪个好,但是它失去了UTC的偏移量,而且我喜欢AM PM格式。

因此,我希望这样:

Tue, 26 Sep 2017 9:00 PM

2 个答案:

答案 0 :(得分:1)

进入12小时格式并保持与UTC的偏移以进行打印:

from dateutil.parser import parse

event_date = '2017-09-26T18:00:0+0300'

date = parse(event_date)
offset = date.tzinfo._offset

readable_event_date = (date + offset).strftime('%a, %b %d %Y %I:%M:%S %p')

print(readable_event_date)

输出:

'Tue, Sep 26 2017 09:00:00 PM'

答案 1 :(得分:1)

看起来你想要的是这次,用UTC表示,格式为'%a, %b %d %Y %I:%M:%S %p'。幸运的是,您执行此操作所需的所有信息都包含在您解析的datetime对象中,您只需要转换为UTC

Python 2.6+或Python 3.3 +

您使用dateutil采用的方法适用于Python 2.6+或Python 3.3。+(并且适用于各种日期时间字符串格式):

from dateutil.parser import parse

# In Python 2.7, you need to use another one
from dateutil.tz import tzutc
UTC = tzutc()

dt_str = '2017-09-26T18:00:00+0300'
dt = parse(dt_str)
dt_utc = dt.astimezone(UTC)  # Convert to UTC

print(dt_utc.strftime('%a, %b %d %Y %I:%M:%S %p'))
# Tue, Sep 26 2017 03:00:00 PM

我注意到的一件事是,据我所知,您提供的日期代表UTC的3PM,而不是9PM(如您的示例所示)。这是您应该使用.astimezone(UTC)而不是其他方法的一个原因。

如果要包含时区偏移量信息,还可以在%z对象的未转换版本上使用datetime参数。

print(dt.strftime('%a, %b %d %Y %I:%M:%S%z %p'))
# Tue, Sep 26 2017 06:00:00+0300 PM

即使您将其保留为UTC,此%z参数也可能有用,因为您至少可以清楚地知道用户看到的日期是UTC日期。

仅限Python 3.2+:

鉴于您知道输入字符串的确切格式,在Python 3.2+中,您可以在不拉入dateutil的情况下实现同样的目标,并且几乎肯定会更快(可能是也可能不是关心你)。在你的情况下,这里是如何重写代码,使它只适用于标准库:

from datetime import datetime, timezone
UTC = timezone.utc

dt_str = '2017-09-26T18:00:00+0300'
dt = datetime.strptime(dt_str, '%Y-%m-%dT%H:%M:%S%z')
dt_utc = dt.astimezone(UTC)

print(dt_utc.strftime('%a, %b %d %Y %I:%M:%S %p'))
# Tue, Sep 26 2017 03:00:00 PM

print(dt.strftime('%a, %b %d %Y %I:%M:%S%z %p'))
# Tue, Sep 26 2017 06:00:00+0300 PM