1

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

但我找不到正确的。

4

2 回答 2

2

使用ICU 日期/时间格式解析本地化日期/时间字符串:

#!/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()),或者您可以直接从格式和语言环境icu.SimpleDateFormat中获取df

有必要使用明确的 ICU 时区(以便可以使用相同的 utc 偏移量),因为并且df.parse()可以使用不同的时区定义。.fromtimestamp()icudatetime

pytz在这里使用,以获得过去/未来日期的正确 UTC 偏移量(某些时区在过去/未来可能有不同的 UTC 偏移量,包括与 DST 转换无关的原因)。

于 2015-02-10T22:54:12.583 回答
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,其他人已经使用该工具成功解析了法语日期。

于 2015-02-10T11:00:45.373 回答