代码之家  ›  专栏  ›  技术社区  ›  AFoeee

用于在本地化字符串和datetime对象之间转换的选项

  •  0
  • AFoeee  · 技术社区  · 6 年前

    我需要

    • 将本地化字符串解析为datetime对象,
    • 使用datetime对象生成本地化字符串。

    问题是默认区域设置(“de \-de”)与本地化字符串(“en \-US”)不匹配。

    sketch of the conversion process

    有哪些选项可以实现所描述的转换?

    1 回复  |  直到 6 年前
        1
  •  1
  •   AFoeee    6 年前

    请注意,我没有研究所有可用的库,只是想为其他人解决问题提供一个起点。

    在所有示例中,我将使用以下本地化字符串:

    dt_str = "Thu 3 Apr 2014 13:19:52"        # en_US
    


    1方法datetime.datetime'

    这是最简单的方法,但是如果您使用的语言环境不是默认的语言环境,那么它将变得很难使用。
    有关语法的信息可以找到 here .

    import datetime
    
    dt = datetime.datetime.strptime(dt_str,
                                    "%a %d %b %Y %H:%M:%S")
    # datetime.datetime(2014, 4, 3, 13, 19, 52)
    
    s = dt.strftime("%a %-d %b %Y %H:%M:%S")
    # 'Thu 3 Apr 2014 13:19:52'
    

    如果要解析或格式化其他区域设置,则必须更改全局区域设置,这可能会导致不希望的副作用(我不推荐这种方法。)

    import datetime
    import locale
    
    locale.setlocale(locale.LC_TIME, "de_DE.UTF-8")
    
    dt = datetime.datetime.strptime("Do 3 Apr 2014 13:19:52",
                                    "%a %d %b %Y %H:%M:%S")
    # datetime.datetime(2014, 4, 3, 13, 19, 52)
    
    s = dt.strftime("%a %-d %b %Y %H:%M:%S")
    # 'Do 3 Apr 2014 13:19:52'
    


    arrow 允许您传递区域设置(否则使用“en\u US”)。

    import arrow        # installed via pip
    import datetime
    
    ### localized string -> datetime
    a_dt = arrow.get(dt_str,
                     "ddd D MMM YYYY H:mm:ss",
                     locale="en_US")                # "en_US" is also the default, so this is just for clarification 
    
    dt = a_dt.datetime
    # datetime.datetime(2014, 4, 3, 13, 19, 52, tzinfo=tzutc())
    
    
    ### datetime -> localized string
    a_s = arrow.get(datetime.datetime(2014, 5, 17, 14, 0, 0))
    
    s = a_s.format("ddd D MMM YYYY H:mm:ss",
                   locale="en_US")                 # "en_US" is also the default, so this is just for clarification
    # 'Sat 17 May 2014 14:00:00'
    

    sketch of the conversion


    三。python库“babel”(主要用于格式化)

    力量 babel 格式是否正确(不幸的是 it can not parse any pattern Only the format "short" seems reliable .)

    import babel.dates    # 'babel' installed via pip
    import datetime
    
    dt = datetime.datetime(2014, 4, 3, 13, 19, 52)
    # parsing is the problem with babel, therefore I created the datetime object directly.
    
    s = babel.dates.format_datetime(dt,
                                    "EEE d MMM yyyy H:mm:ss", 
                                    locale="en_US")
    # 'Thu 3 Apr 2014 13:19:52'
    


    dateparser 非常强大。它能够在较长的文本中查找日期,并且支持非公历系统,仅举几个特性。

    import dateparser        # installed via pip
    
    dt = dateparser.parse(dt_str,
                          date_formats=["%a %d %b %Y %H:%M:%S"],
                          languages=["en"])
    # datetime.datetime(2014, 4, 3, 13, 19, 52)
    


    5最后但并非最不重要