在本地化字符串和日期时间对象之间转换的选项

时间:2018-09-17 18:40:57

标签: python datetime parsing localization formatting

我需要

  • 将本地化的字符串解析为日期时间对象,
  • 使用日期时间对象生成本地化的字符串。

问题是默认语言环境(“ de_DE”)与本地化字符串(“ en_US”)不匹配。

sketch of the conversion process

有哪些选项可以实现上述转换?

1 个答案:

答案 0 :(得分:0)

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

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

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'


2。 python库“箭头”

arrow允许您传递语言环境(否则使用“ en_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


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

babel的优势在于格式(很遗憾,it can not parse any patternOnly 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'


4。 python库“ dateparser”(仅用于解析)

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。最后但并非最不重要

以下值得注意的python库具有强大的功能,但不幸的是,我无法将它们用于此特定问题(或不知道如何正确使用它们)。