Python解析日期并找到正确的locale_setting

时间:2015-02-10 10:35:26

标签: python datetime internationalization locale datetime-parsing

我有以下日期字符串:'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

但我找不到正确的那个。

2 个答案:

答案 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偏移量),因为icudatetime可能使用不同的时区定义

这里使用

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