
В Python для работы с датой и временем используется модуль datetime, который позволяет создавать объекты даты и времени, а также выполнять над ними арифметические операции. Часто возникает необходимость преобразовать объект datetime в строку, чтобы сохранить дату в логах, передать её через API или вывести пользователю в читаемом виде.
Метод strftime предоставляет гибкий способ форматирования объектов datetime. С его помощью можно выбрать конкретные элементы даты и времени: день, месяц, год, часы, минуты и секунды. Например, формат %Y-%m-%d %H:%M:%S выдаёт строку вида «2025-12-15 10:30:00».
При работе с временными зонами важно учитывать метод astimezone, который позволяет преобразовать объект datetime в локальное время перед его конвертацией в строку. Это предотвращает ошибки при отображении времени для разных регионов.
Для обратного преобразования строки в объект datetime используется метод strptime. Он проверяет соответствие строки заданному формату, что позволяет гарантировать корректность данных перед их использованием в вычислениях или хранении.
Обработка ошибок при некорректном формате строки критична. Использование конструкции try-except позволяет перехватывать исключения ValueError и предотвращать сбои программы при неправильном формате даты или времени.
Использование метода strftime для форматирования даты и времени

Метод strftime объекта datetime позволяет преобразовать дату и время в строку с заданным форматом. Он принимает строку формата, где специальные коды обозначают части даты и времени.
Примеры часто используемых кодов:
%Y– год в 4 цифры (например, 2025)%y– год в 2 цифры (например, 25)%m– месяц с ведущим нулем (01–12)%d– день месяца с ведущим нулем (01–31)%H– час в 24-часовом формате (00–23)%M– минуты с ведущим нулем (00–59)%S– секунды с ведущим нулем (00–59)%A– полное название дня недели (например, Monday)%B– полное название месяца (например, December)
Пример использования:
from datetime import datetime
now = datetime.now()
formatted_date = now.strftime("%d.%m.%Y %H:%M:%S")
print(formatted_date)
Результат будет строкой вида 15.12.2025 10:45:30. Для локализации названий дней и месяцев можно использовать модуль locale:
import locale
locale.setlocale(locale.LC_TIME, "ru_RU.UTF-8")
print(now.strftime("%A, %d %B %Y"))
Метод strftime также поддерживает комбинирование нескольких кодов для создания любых пользовательских форматов. Например:
%d/%m/%y– краткий формат даты%H:%M– только часы и минуты%Y-%m-%dT%H:%M:%S– формат ISO 8601
Использование strftime удобно для записи дат в файлы, отображения на интерфейсе и передачи в API, где требуется строго определённый формат строки.
Преобразование текущей даты и времени в строку
Для получения текущей даты и времени используется функция datetime.now() из модуля datetime. Преобразовать результат в строку можно через метод strftime.
Пример преобразования в стандартный формат:
from datetime import datetime
now = datetime.now()
current_time_str = now.strftime("%Y-%m-%d %H:%M:%S")
print(current_time_str)
Результат будет вида 2025-12-15 10:45:30. Для отображения только даты или времени используют отдельные коды формата:
- Только дата:
now.strftime("%d.%m.%Y")→15.12.2025 - Только время:
now.strftime("%H:%M:%S")→10:45:30
Для пользовательских форматов комбинируются коды:
%A– день недели%d– день месяца%B– название месяца%Y– год%H,%M,%S– часы, минуты, секунды
Пример локализованного формата на русском языке:
import locale
locale.setlocale(locale.LC_TIME, "ru_RU.UTF-8")
print(now.strftime("%A, %d %B %Y %H:%M"))
Результат: понедельник, 15 декабря 2025 10:45. Такой подход удобен для логирования, генерации отчётов и отображения текущего времени в приложениях.
Форматы даты: как получить только год, месяц или день

Для извлечения отдельных компонентов даты из объекта datetime используют метод strftime или прямой доступ к атрибутам.
С помощью strftime можно получить:
- Только год:
dt.strftime("%Y")→2025 - Только месяц:
dt.strftime("%m")→12 - Только день:
dt.strftime("%d")→15
Прямой доступ к атрибутам объекта datetime:
dt.year→2025dt.month→12dt.day→15
Пример кода:
from datetime import datetime
dt = datetime.now()
year = dt.year
month = dt.month
day = dt.day
print(f"Год: {year}, Месяц: {month}, День: {day}")
print(dt.strftime("Год: %Y, Месяц: %m, День: %d"))
Такой подход позволяет получать отдельные части даты для анализа, формирования отчетов и хранения в определённом формате.
Форматы времени: часы, минуты, секунды в строковом виде
В Python для преобразования времени в строку используется метод strftime объекта datetime. Основные компоненты времени представлены следующими форматами:
%H– часы в 24-часовом формате (00–23).%I– часы в 12-часовом формате (01–12).%M– минуты (00–59).%S– секунды (00–59).%f– микросекунды (000000–999999).%p– AM/PM для 12-часового формата.
Примеры использования:
- Получение времени в 24-часовом формате:
datetime.now().strftime("%H:%M:%S")вернёт строку вида14:35:42. - Время в 12-часовом формате с обозначением AM/PM:
datetime.now().strftime("%I:%M:%S %p")вернёт строку вида02:35:42 PM. - Включение микросекунд:
datetime.now().strftime("%H:%M:%S.%f")вернёт14:35:42.123456.
datetime.now().strftime("%M:%S") вернёт 35:42.
Комбинируя эти форматы, можно создавать строки времени с нужной точностью и стилем. Для упрощённого отображения часто используют только часы и минуты, а для логирования или точных вычислений – добавляют секунды и микросекунды.
Преобразование datetime с учётом временной зоны
В Python объекты datetime могут быть «naive» (без информации о временной зоне) или «aware» (с информацией о временной зоне). Для корректного преобразования в строку с учётом часового пояса необходимо использовать «aware» объекты.
Создание объекта с временной зоной выполняется через модуль pytz или встроенный zoneinfo (Python 3.9+):
- Использование
pytz:dt = datetime(2025, 12, 15, 14, 30, tzinfo=pytz.timezone('Europe/Moscow')) - Использование
zoneinfo:from zoneinfo import ZoneInfodt = datetime(2025, 12, 15, 14, 30, tzinfo=ZoneInfo("Europe/Moscow"))
Для преобразования «aware» объекта в строку с отображением временной зоны применяют %Z или %z:
%Z– сокращённое название временной зоны, напримерMSK.%z– смещение от UTC в формате+0300.
Пример форматирования:
dt.strftime("%Y-%m-%d %H:%M:%S %Z %z") вернёт 2025-12-15 14:30:00 MSK +0300.
Для конвертации между часовыми поясами используется метод astimezone():
dt_utc = dt.astimezone(ZoneInfo("UTC"))dt_utc.strftime("%Y-%m-%d %H:%M:%S %Z %z") вернёт 2025-12-15 11:30:00 UTC +0000.
Такой подход гарантирует корректное отображение времени для разных регионов и учёт перехода на летнее/зимнее время.
Преобразование строки обратно в datetime для проверки формата
Для обратного преобразования строки в объект datetime используется метод strptime из модуля datetime. Он принимает два аргумента: строку с датой и формат, который описывает структуру этой строки.
Пример базового использования:
from datetime import datetime
date_str = "2025-12-15 14:30"
date_obj = datetime.strptime(date_str, "%Y-%m-%d %H:%M")
print(date_obj) # 2025-12-15 14:30:00
Если формат строки не совпадает с указанным в strptime, будет вызвано исключение ValueError, что позволяет проверить корректность формата.
Таблица основных спецификаторов формата для проверки:
| Спецификатор | Описание | Пример |
|---|---|---|
| %Y | Год с четырьмя цифрами | 2025 |
| %m | Месяц в виде числа 01–12 | 12 |
| %d | День месяца 01–31 | 15 |
| %H | Час 00–23 | 14 |
| %M | Минуты 00–59 | 30 |
| %S | Секунды 00–59 | 00 |
Для проверки формата строки рекомендуется использовать конструкцию try-except:
from datetime import datetime
date_str = "15-12-2025"
try:
date_obj = datetime.strptime(date_str, "%d-%m-%Y")
print("Формат корректен:", date_obj)
except ValueError:
print("Неверный формат даты")
Этот метод гарантирует точное соответствие строки ожидаемому формату и предотвращает ошибки при последующих вычислениях с датами.
Обработка ошибок при неправильном формате даты или времени
При использовании strptime для преобразования строки в datetime несоответствие формата вызывает исключение ValueError. Для безопасной обработки таких ошибок применяется конструкция try-except.
Пример проверки корректности даты:
from datetime import datetime
date_str = "2025/31/12"
try:
date_obj = datetime.strptime(date_str, "%Y-%m-%d")
print("Дата корректна:", date_obj)
except ValueError as e:
print("Ошибка формата:", e)
Можно использовать сообщение об ошибке для информирования пользователя о требуемом формате. Это повышает точность ввода и предотвращает некорректные данные.
Для нескольких форматов даты применяется последовательная проверка:
formats = ["%Y-%m-%d", "%d/%m/%Y", "%d-%m-%Y"]
for fmt in formats:
try:
date_obj = datetime.strptime(date_str, fmt)
print("Формат найден:", fmt)
break
except ValueError:
continue
else:
print("Ни один формат не подошёл")
Использование таких подходов позволяет гарантировать обработку ошибок и корректное преобразование строки в объект datetime без сбоев программы.
Вопрос-ответ:
Как в Python преобразовать объект datetime в строку с указанием только даты?
Для получения строки, содержащей только дату, используют метод strftime. Например, если есть объект dt = datetime.datetime(2025, 12, 15, 14, 30), то строку с датой можно получить так: dt.strftime("%Y-%m-%d"). Результат будет '2025-12-15'. Формат %Y отвечает за год, %m — за месяц, %d — за день.
Можно ли преобразовать datetime в строку только с временем без даты?
Да, метод strftime позволяет извлечь только время. Для объекта dt можно написать dt.strftime("%H:%M:%S"). В этом случае получится строка вида '14:30:00', где %H — часы в 24-часовом формате, %M — минуты, %S — секунды.
Какие существуют альтернативы strftime для преобразования datetime в строку?
Кроме strftime, объект datetime можно преобразовать в строку с помощью метода isoformat(). Например, dt.isoformat() вернёт строку '2025-12-15T14:30:00'. Этот способ удобен для стандартизированных форматов и передачи данных между системами, где требуется формат ISO 8601.
Как вывести дату в виде «15 декабря 2025» вместо числового формата?
Метод strftime позволяет использовать названия месяцев и дней недели. Для примера: dt.strftime("%d %B %Y") выдаст '15 December 2025'. Если нужен русский язык, нужно подключить модуль locale и установить локаль: locale.setlocale(locale.LC_TIME, "ru_RU.UTF-8"). Тогда результат будет '15 декабря 2025'.
Как преобразовать datetime в строку с указанием только года или месяца?
Для получения отдельных частей даты используют те же спецификаторы формата. Например, чтобы получить год: dt.strftime("%Y") вернёт '2025', а для месяца: dt.strftime("%m") вернёт '12'. Это удобно, если нужно формировать отчёты или фильтровать данные по годам или месяцам.
Как преобразовать текущую дату и время в строку с форматом «день-месяц-год часы:минуты»?
Для этого используют метод strftime объекта datetime. Например, если есть dt = datetime.datetime.now(), строку в формате «день-месяц-год часы:минуты» можно получить так: dt.strftime("%d-%m-%Y %H:%M"). Здесь %d обозначает день, %m — месяц, %Y — год, %H — часы, %M — минуты. Результат будет вроде '15-12-2025 14:30', что удобно для вывода даты и времени пользователю.
Можно ли преобразовать datetime в строку с использованием названий месяцев на русском языке?
Да, это можно сделать с помощью метода strftime вместе с установкой локали. Сначала подключают модуль locale и устанавливают русскую локаль: locale.setlocale(locale.LC_TIME, "ru_RU.UTF-8"). После этого dt.strftime("%d %B %Y") вернёт строку вида '15 декабря 2025'. Спецификатор %B отвечает за полное название месяца, а %d и %Y — за день и год соответственно.
