关于python:如何将从Facebook Graph检索的时间解析为12小时格式?

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

当我从脸书图表开始时,出现在这个表格中:

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

我想把它转换成现实的格式

ZZU1

而它来到这里,就像这样:

1
Tue, 26 Sep 2017 18:00:00

这是好的,但它失去了UTC的胶印,我喜欢它在PM格式。

Thus,I would like this:

1
Tue, 26 Sep 2017 9: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.+(也适用于更多种日期时间字符串格式):

1
2
3
4
5
6
7
8
9
10
11
12
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参数。

1
2
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的情况下实现相同的操作,而且它几乎肯定会更快(这可能是您的问题,也可能不是您的问题)。在您的情况下,这里介绍如何重写代码,以便它只与标准库一起工作:

1
2
3
4
5
6
7
8
9
10
11
12
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

要进入12小时格式并保持与UTC的偏移以便打印,请执行以下操作:

1
2
3
4
5
6
7
8
9
10
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)

输出:

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