我有以下日期字符串:'3févr。 2015 14:26:00 CET'
datetime.datetime.strptime('03 févr. 2015 14:26:00', '%d %b %Y %H:%M:%S')
解析此失败并显示错误:
ValueError: time data '03 f\xc3\xa9vr. 2015 14:26:00' does not match format '%d %b %Y %H:%M:%S'
我尝试使用locale.locale_alias
:
for l in locale.locale_alias:
try:
locale.setlocale(locale.LC_TIME, l)
print l,datetime.datetime.strptime('03 févr. 2015 14:26:00', '%d %b %Y %H:%M:%S')
break
except Exception as e:
print e
但我找不到正确的那个。
答案 0 :(得分:1)
使用ICU date/time format解析本地化的日期/时间字符串:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import datetime
import icu # PyICU
import pytz # $ pip install pytz
tz = icu.ICUtzinfo.getDefault() # any ICU timezone will do here
df = icu.DateFormat.createDateTimeInstance(icu.DateFormat.MEDIUM,
icu.DateFormat.MEDIUM,
icu.Locale.getFrench())
df.setTimeZone(tz.timezone)
ts = df.parse(u'3 févr. 2015 14:26:00 CET') #NOTE: CET is ignored
naive_dt = datetime.fromtimestamp(ts, tz).replace(tzinfo=None)
dt = pytz.timezone('Europe/Paris').localize(naive_dt, is_dst=None)
print(dt) # -> 2015-02-03 14:26:00+01:00
df.applyPattern()
可用于设置不同的日期/时间模式(df.toPattern()
),也可以use icu.SimpleDateFormat
to get df
from the format and the locale directly。
有必要使用明确的ICU时区(以便df.parse()
和.fromtimestamp()
可以使用相同的utc偏移量),因为icu
和datetime
可能使用不同的时区定义
pytz
来获得过去/未来日期的正确UTC偏移(某些时区在过去/未来可能有不同的utc偏移,包括与DST过渡无关的原因)。
答案 1 :(得分:0)
您的格式包含缩写的点,并使用4个字符:
'03 févr. 2015 14:26:00'
# ^^
但如果我将区域设置设置为fr_FR
并格式化相同的日期:
>>> import locale, datetime
>>> locale.setlocale(locale.LC_TIME, ('fr', 'UTF-8'))
'fr_FR.UTF-8'
>>> datetime.datetime(2015, 2, 3, 14, 26).strftime('%d %b %Y %H:%M:%S')
'03 f\xc3\xa9v 2015 14:26:00'
>>> print datetime.datetime(2015, 2, 3, 14, 26).strftime('%d %b %Y %H:%M:%S')
03 fév 2015 14:26:00
您会注意到只使用 3个字符并且不包含任何点。解析日期仅支持相同的3个字符缩写:
>>> datetime.datetime.strptime('03 fév 2015 14:26:00', '%d %b %Y %H:%M:%S')
datetime.datetime(2015, 2, 3, 14, 26)
您可以尝试使用parsedatetime
library,其他人则使用该工具had success parsing French dates。