如何将从 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
当我从 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