Параметры для преобразования между локализованными строками и объектами даты и времени - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужно

  • проанализировать локализованную строку для объекта datetime,
  • использовать объект datetime для генерации локализованной строки.

Проблема в том, что локаль по умолчанию ("de_DE") не соответствует локализованной строке ("en_US").

sketch of the conversion process

Какие есть варианты для реализации описанных преобразований?

1 Ответ

0 голосов
/ 19 сентября 2018

Обратите внимание, что я не изучил все доступные библиотеки и просто хочу предоставить отправную точку для решения других проблем.

Я буду использовать следующую локализованную строку во всех примерах:

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


1.Методы datetime.datetime

Это самый простой подход, но он становится громоздким, если вы используете локали, отличные от локали по умолчанию.
Информацию о синтаксисе можно найти здесь .

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'

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 - это форматирование (К сожалению, не может разобрать любойpattern . Надежным представляется только формат "короткий" .)

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 имеют отличные функции, но, к сожалению, я не смог использовать их для этой конкретной проблемы (или не знал, как их правильно использовать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...