Как преобразовать строку с датой в объект `datetime`, используя локализованный формат (например, для разных языков)?

Для преобразования строки с датой в объект datetime с учетом локализации, можно использовать модуль locale в сочетании с модулем datetime и библиотекой babel:
  1. Установить babel: pip install babel
  2. Установить локаль: locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8') (пример для французского языка). Необходимо убедиться, что локаль установлена в системе.
  3. Использовать babel.dates.parse_datetime для преобразования строки, зная формат: babel.dates.parse_datetime('25 janvier 2024', locale='fr_FR'). Если формат неизвестен заранее, может потребоваться анализ строки или использование библиотеки dateparser (pip install dateparser).
  4. В качестве альтернативы, если формат даты известен заранее, можно использовать datetime.datetime.strptime в связке с отображением формата даты на основе локали. Но это потребует большей предварительной работы для определения правильного формата для каждой локали.
Пример:

import locale
import babel.dates
import datetime

try:
    locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')
except locale.Error:
    print("Локаль fr_FR.UTF-8 не поддерживается в системе")

date_string = '25 janvier 2024'
try:
    date_object = babel.dates.parse_datetime(date_string, locale='fr_FR')
    print(date_object) # Вывод: 2024-01-25 00:00:00
except ValueError:
    print(f"Не удалось преобразовать строку '{date_string}'")

  

Преобразование строки с датой в объект datetime с учетом локализованного формата требует использования модуля locale и модуля datetime в Python. Основная идея заключается в установке соответствующей локали и использовании методов strptime() для разбора строки в соответствии с этой локалью.

Пример:


import datetime
import locale

def parse_localized_date(date_string, locale_name, format_string):
  """
  Преобразует строку с датой в объект datetime, используя указанную локаль и формат.

  Args:
    date_string: Строка с датой.
    locale_name: Имя локали (например, 'ru_RU.UTF-8', 'de_DE.UTF-8').
    format_string: Формат даты, соответствующий локали (например, '%d.%m.%Y', '%Y-%m-%d').

  Returns:
    Объект datetime или None, если преобразование не удалось.
  """
  try:
    # Устанавливаем локаль
    locale.setlocale(locale.LC_TIME, locale_name)

    # Преобразуем строку в объект datetime
    date_object = datetime.datetime.strptime(date_string, format_string)

    return date_object
  except ValueError:
    print(f"Ошибка: Не удалось преобразовать строку '{date_string}' с форматом '{format_string}' и локалью '{locale_name}'.")
    return None
  except locale.Error as e:
    print(f"Ошибка: Локаль '{locale_name}' не поддерживается: {e}")
    return None
  finally:
    # Возвращаем локаль по умолчанию (важно для предотвращения неожиданного поведения в других частях программы)
    locale.setlocale(locale.LC_TIME, '') # Пустая строка возвращает локаль по умолчанию

# Примеры использования:
date_string_ru = "21.12.2023"
date_format_ru = "%d.%m.%Y"
locale_ru = "ru_RU.UTF-8"
date_object_ru = parse_localized_date(date_string_ru, locale_ru, date_format_ru)

if date_object_ru:
  print(f"Русская дата: {date_object_ru}")


date_string_de = "21.12.2023"
date_format_de = "%d.%m.%Y"
locale_de = "de_DE.UTF-8"
date_object_de = parse_localized_date(date_string_de, locale_de, date_format_de)

if date_object_de:
  print(f"Немецкая дата: {date_object_de}")


date_string_en = "12/21/2023"
date_format_en = "%m/%d/%Y"
locale_en = "en_US.UTF-8"
date_object_en = parse_localized_date(date_string_en, locale_en, date_format_en)

if date_object_en:
  print(f"Американская дата: {date_object_en}")

  

Объяснение:

  • locale.setlocale(locale.LC_TIME, locale_name): Устанавливает локаль для форматирования времени и даты. locale.LC_TIME указывает, что локаль применяется только к функциям, связанным со временем и датой. Важно установить локаль до использования strptime().
  • datetime.datetime.strptime(date_string, format_string): Преобразует строку date_string в объект datetime в соответствии с указанным форматом format_string и установленной локалью. Форматные строки (например, %d для дня, %m для месяца, %Y для года) должны соответствовать локализованным форматам.
  • Обработка исключений: Код включает обработку исключений ValueError (если строка не соответствует формату) и locale.Error (если указанная локаль не поддерживается).
  • Сброс локали: В блоке finally локаль сбрасывается к значению по умолчанию locale.setlocale(locale.LC_TIME, ''). Это важно, чтобы избежать влияния установленной локали на другие части программы, которые могут использовать даты и время в другом формате.

Важно:

  • Перед использованием убедитесь, что нужная локаль установлена в системе. В некоторых системах может потребоваться установка пакетов локализации (например, используя sudo apt-get install language-pack-ru в Linux).
  • Форматная строка format_string должна точно соответствовать формату даты в выбранной локали. Неправильный формат приведет к ошибке ValueError.
  • Регистр букв в форматных строках имеет значение (например, %Y для года с четырьмя цифрами, %y для года с двумя цифрами).
  • Установка и сброс локали может быть ресурсоемкой операцией, поэтому, если требуется обрабатывать большое количество дат в одной и той же локали, может быть целесообразно установить локаль один раз в начале и сбросить ее в конце.

Дополнительные замечания:

  • locale.getlocale() позволяет получить текущую установленную локаль.
  • Проверьте, что используемая локаль поддерживается операционной системой. Иначе, программа выбросит исключение.
0