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

How to parse time retrieved from Facebook Graph into 12 hour format?

当我从 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

要进入 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'

看来你要的是这个时间,用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 的下午 3 点,而不是晚上 9 点(如您的示例所述)。这是您应该使用 .astimezone(UTC) 而不是其他方法的原因之一。

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

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

这个 %z 参数也可能有用,即使您将它保存在 UTC 中,因为这样您至少可以清楚用户看到的日期是 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