Python解析日期并找到正确的区域设置\u设置
我有以下日期字符串:“3févr。2015年14:26:00 CET'Python解析日期并找到正确的区域设置\u设置,python,datetime,internationalization,locale,datetime-parsing,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\u alias遍历所有区
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\u 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个字符:
'03 févr. 2015 14:26:00'
# ^^
但是如果我将区域设置为fr\u 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)
您可以尝试其他人使用该工具所做的操作。要解析本地化的日期/时间字符串,请使用:
df.applyPattern()
可用于设置不同的日期/时间模式(df.toPattern()
),也可以
有必要使用明确的ICU时区(以便df.parse()
和fromtimestamp()
可以使用相同的utc偏移量),因为ICU
和datetime
可以使用不同的时区定义
pytz
用于获取过去/未来日期的正确UTC偏移量(某些时区在过去/未来可能有不同的UTC偏移量,包括与DST转换无关的原因)。Java朋友们都在笑,因为它可以很好地为他们提供以下代码:DateFormatSymbols dfs=new DateFormatSymbols(Locale.FRENCH); SimpleDataFormat sdf=新的SimpleDataFormat(“dd-MMM-yy”,dfs);日期=sdf.parse(“09 févr.08”);System.out.println(“-->”+日期)代码>当然可以,但这是另一种语言,datetime
解析正在进行,但有点慢。我确信Python项目希望得到更多的帮助来解决这些问题。@seb835:如果愿意,您可以使用PyICU(与Java可能使用的后端相同)parsedatetime
也可以使用it@J.F.Sebastian:说得好;我错过了parsedatetime
如果安装了PiICU,就可以使用它。Martijn Pieters,J.F.Sebastian:非常感谢您宝贵的帮助。
#!/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