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.SimpleDateFormatdf

と が異なるタイムゾーン定義を使用する可能性があるため、 ( とdf.parse().fromtimestamp()同じ utc オフセットを使用できるように)明示的な ICU タイムゾーンを使用する必要があります。icudatetime

pytzここでは、過去/未来の日付の適切な UTC オフセットを取得するために使用されます (一部のタイムゾーンでは、DST 移行とは関係のない理由を含め、過去/未来で異なる utc オフセットを持つ場合があります)。

于 2015-02-10T22:54:12.583 に答える