Python 使用dateutil.parser以另一种语言解析日期

Python 使用dateutil.parser以另一种语言解析日期,python,date,localization,internationalization,python-dateutil,Python,Date,Localization,Internationalization,Python Dateutil,Dateutil是以字符串格式解析日期的好工具。比如说 from dateutil.parser import parse parse("Tue, 01 Oct 2013 14:26:00 -0300") 返回 datetime.datetime(2013, 10, 1, 14, 26, tzinfo=tzoffset(None, -10800)) 但是, parse("Ter, 01 Out 2013 14:26:00 -0300") # In portuguese 产生以下错误: Va

Dateutil是以字符串格式解析日期的好工具。比如说

from dateutil.parser import parse
parse("Tue, 01 Oct 2013 14:26:00 -0300")
返回

datetime.datetime(2013, 10, 1, 14, 26, tzinfo=tzoffset(None, -10800))
但是,

parse("Ter, 01 Out 2013 14:26:00 -0300") # In portuguese
产生以下错误:

ValueError:未知的字符串格式

有人知道如何让dateutil知道语言环境吗?

据我所知,dateutil还不知道语言环境

我可以想出三个备选建议:

  • 日期和月份名称在
    dateutil.parser
    中硬编码(作为
    parserinfo
    类的一部分)。您可以将parserinfo子类化,并将这些名称替换为葡萄牙语的适当名称

  • 修改dateutil以根据用户的区域设置获取日期和月份名称。所以你可以做一些像

    import locale
    locale.setlocale(locale.LC_ALL, "pt_PT")
    
    from dateutil.parser import parse
    parse("Ter, 01 Out 2013 14:26:00 -0300")
    
    我启动了一个fork,它从
    日历
    模块(具有区域设置意识)中获取名称,以处理以下问题:

    现在它适用于葡萄牙语(或者似乎适用),但在我向主分支提交补丁之前,我想再考虑一下。特别是,当它面对西欧语言中没有使用的字符时,可能会发生奇怪的事情。我还没有测试过这个。(见附件)

  • 如果您没有绑定到dateutil模块,则可以使用datetime,它已经具有区域设置意识:

    from datetime import datetime, date
    import locale
    
    locale.setlocale(locale.LC_ALL, "pt_PT")
    datetime.strptime("Ter, 01 Out 2013 14:26:00 -0300",
                      "%a, %d %b %Y %H:%M:%S %z")
    
    (请注意,
    %z
    标记为。)

您可以使用以下格式解析本地化的日期/时间字符串:

它适用于Python 2/3。它不修改全局状态(区域设置)

如果您的实际输入时间字符串不包含显式utc偏移量,则您应该这样做,否则您可能会得到错误的结果(ICU和datetime可能使用不同的时区定义)

如果您只需要支持Python 3,并且不介意设置区域设置,那么可以使用
datetime.strtime()
作为:

结果:

datetime.datetime(2013, 1, 28, 14, 26, tzinfo=tzoffset(None, -10800))

我认为最好的解决方案是从dateutil中对解析器进行子类化,并使用
calendar
lib常量。这是一个简单的解决方案,我没有对它进行过很多测试,所以请谨慎使用

它非常简单,可以本地化许多语言的dateutil。创建一个模块
localeparseinfo.py

import calendar
from dateutil import parser
    
class LocaleParserInfo(parser.parserinfo):
    WEEKDAYS = zip(calendar.day_abbr, calendar.day_name)
    MONTHS = list(zip(calendar.month_abbr, calendar.month_name))[1:]
现在,您可以使用新的parseinfo对象作为
dateutil.parser
的参数

In [1]: import locale;locale.setlocale(locale.LC_ALL, "pt_BR.utf8")
In [2]: from localeparserinfo import LocaleParserInfo                                   

In [3]: from dateutil.parser import parse                                                

In [4]: parse("Ter, 01 Out 2013 14:26:00 -0300", parserinfo=PtParserInfo())              
Out[4]: datetime.datetime(2013, 10, 1, 14, 26, tzinfo=tzoffset(None, -10800))
看,这解决了许多不同的语言解析,但对于所有可能的日期和时间来说,这是一个不完整的解决方案。看看dateutil
parser.py
,特别是
parserinfo
类变量。看看HMS变量和其他变量


您甚至可以将区域设置字符串作为参数传递给parserinfo类。

有一种方法为使用
dateutil
进行解析添加了语言支持。不过,我看不到葡萄牙人的支持。相关:相关:你链接的答案是错误的。我在那里留下了相应的评论。我的意思是关于%z的答案。
datetime.datetime(2013, 1, 28, 14, 26, tzinfo=tzoffset(None, -10800))
import calendar
from dateutil import parser
    
class LocaleParserInfo(parser.parserinfo):
    WEEKDAYS = zip(calendar.day_abbr, calendar.day_name)
    MONTHS = list(zip(calendar.month_abbr, calendar.month_name))[1:]
In [1]: import locale;locale.setlocale(locale.LC_ALL, "pt_BR.utf8")
In [2]: from localeparserinfo import LocaleParserInfo                                   

In [3]: from dateutil.parser import parse                                                

In [4]: parse("Ter, 01 Out 2013 14:26:00 -0300", parserinfo=PtParserInfo())              
Out[4]: datetime.datetime(2013, 10, 1, 14, 26, tzinfo=tzoffset(None, -10800))