首页 > 解决方案 > 如何使用 Python 3 使用来自另一个时区的格式指令将字符串转换为日期时间

问题描述

我的 Django 应用程序中有从 SSH 提取信息的功能。我得到一个原始日期字符串,如下所示(法语):

'马尔。2012 年 3 月 27 日 17:51:42 CEST'

我的问题是我需要将此字符串转换为 datetime 对象,然后再将其传递给我的模型之一,但出现错误。

ssh_output = 'mar. 27 mars 2012 17:51:42 CEST'
my_datetime = datetime.datetime.strptime(ssh_output,"%a. %d %B %Y %H:%M:%S CEST")

上面的代码抛出异常:

时间数据'mar。2012 年 3 月 27 日 17:51:42 CEST' 与格式 '%a. %d %B %Y %H:%M:%S CEST'

我很困惑,因为locale.getlocale() 输出:“

('fr_FR', 'UTF-8')

datetime.datetime.now().strftime("%a %d %B %Y %H:%M:%S %Z")但是使用输出(英语)测试日期时间格式:

2020 年 7 月 8 日星期三 15:46:11

此外,所有日期格式指令似乎都是正确的(加上文字字符串 '.' 和 'CEST'):

所以看起来原始日期时间字符串是从 SSH 输出 'mar. 2012 年 3 月 27 日 17:51:42 CEST' 无法解析/转换,因为它与当前时区不匹配...

在这种情况下,如何将此原始日期时间字符串转换为日期时间?

标签: python-3.xdjangolinuxdatetime

解决方案


要解析CEST到正确的时区,您可以将 ssh 输出拆分为日期时间部分和时区部分。之后,您可以应用映射字典:

import datetime
import dateutil

import locale
locale.setlocale(locale.LC_ALL, 'fr_FR')

ssh_output = 'mar. 27 mars 2012 17:51:42 CEST'

# assuming timezone abbreviation separated by space
parts = ssh_output.split(' ')
timestr, tzstr = ' '.join(parts[:-1]), parts[-1]

# create a custom mapping dict
tzmapping = {'CEST': dateutil.tz.gettz('Europe/Paris')}

my_datetime = datetime.datetime.strptime(timestr,"%a %d %B %Y %H:%M:%S")
my_datetime = my_datetime.replace(tzinfo=tzmapping[tzstr])
# datetime.datetime(2012, 3, 27, 17, 51, 42, tzinfo=tzfile('Europe/Paris'))

推荐阅读