python-3.x - 如何使用 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'):
- %a:工作日作为语言环境的缩写名称。
- %d : 以零填充十进制数表示的月份中的日期。
- %B : 月份作为语言环境的全名。
- %Y:年份,世纪为十进制数。
- %H : 小时(24 小时制),用零填充的十进制数表示。
- %M:分钟作为一个零填充的十进制数。
- %S:秒作为一个零填充的十进制数。
所以看起来原始日期时间字符串是从 SSH 输出 'mar. 2012 年 3 月 27 日 17:51:42 CEST' 无法解析/转换,因为它与当前时区不匹配...
在这种情况下,如何将此原始日期时间字符串转换为日期时间?
解决方案
要解析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'))