Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python解析日期并找到正确的区域设置\u设置_Python_Datetime_Internationalization_Locale_Datetime Parsing - Fatal编程技术网

Python解析日期并找到正确的区域设置\u设置

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遍历所有区

我有以下日期字符串:“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
遍历所有区域设置:

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