
Метод strftime принимает строку формата, где каждый символ или последовательность символов соответствует определённой части даты. Например, %Y возвращает год в четырёхзначном виде, %m – месяц с ведущим нулём, %d – день месяца. Для формирования формата «день-месяц-год часы:минуты:секунды» используется строка «%d-%m-%Y %H:%M:%S», которая гарантированно корректно отобразит дату независимо от локальных настроек.
Для упрощения работы с датами, можно использовать метод isoformat(), который возвращает строку в формате ISO 8601: YYYY-MM-DDTHH:MM:SS.mmmmmm. Этот вариант особенно удобен для передачи данных между системами, поскольку поддерживается большинством библиотек для обработки времени.
Важно учитывать, что перед форматированием datetime может содержать часовой пояс. Для приведения даты к локальному или UTC времени применяется метод astimezone(). Это обеспечивает точность отображения времени при преобразовании в строку и предотвращает ошибки при работе с разными часовыми поясами.
Использование strftime для стандартного форматирования даты и времени
Метод strftime позволяет преобразовать объект datetime в строку по заданному формату. Формат задается комбинацией специальных символов, каждый из которых соответствует элементу даты или времени.
Примеры часто используемых спецификаторов: %Y – полный год, %m – месяц с ведущим нулем, %d – день месяца, %H – час в 24-часовом формате, %M – минуты, %S – секунды.
Для стандартного ISO-формата даты и времени используется строка формата "%Y-%m-%d %H:%M:%S". Пример:
from datetime import datetime
now = datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted)
Метод strftime поддерживает локализацию: %A и %B возвращают полные названия дня недели и месяца на языке системы или установленной локали.
today = datetime.today()
date_str = today.strftime("%d.%m.%Y")
time_str = today.strftime("%H:%M")
Форматирование только даты или только времени из datetime
В Python объект datetime объединяет дату и время, но часто требуется извлечь только один компонент. Для этого используют методы date() и time(). Например, dt.date() возвращает объект date с годом, месяцем и днём, а dt.time() – объект time с часами, минутами, секундами и микросекундами.
Чтобы преобразовать только дату в строку, используют strftime с шаблонами: %Y – год, %m – месяц, %d – день. Пример: dt.date().strftime('%d.%m.%Y') выдаст строку вида '14.09.2025'.
Для форматирования только времени применяют шаблоны: %H – часы в 24-часовом формате, %M – минуты, %S – секунды. Пример: dt.time().strftime('%H:%M:%S') создаст строку '16:30:45'.
При локализации даты используют директиву %A для полного названия дня недели, %B для месяца. Пример: dt.date().strftime('%A, %d %B %Y') – 'Воскресенье, 14 сентября 2025'.
Комбинируя методы date(), time() и strftime, можно гибко получать строки с нужной частью datetime без лишних данных.
Добавление часового пояса при преобразовании datetime в строку

Для включения информации о часовом поясе объект datetime должен быть «aware». В Python 3.9+ используется модуль zoneinfo. Пример привязки к часовому поясу:
from datetime import datetime
from zoneinfo import ZoneInfo
dt = datetime(2025, 9, 14, 15, 30)
dt_aware = dt.replace(tzinfo=ZoneInfo("Europe/Moscow"))
dt_str = dt_aware.strftime("%Y-%m-%d %H:%M:%S %Z%z")
print(dt_str)
2025-09-14 15:30:00 MSK+0300
Использование pytz:
import pytz
from datetime import datetime
dt = datetime(2025, 9, 14, 15, 30)
moscow_tz = pytz.timezone("Europe/Moscow")
dt_aware = moscow_tz.localize(dt)
dt_str = dt_aware.strftime("%Y-%m-%d %H:%M:%S %Z%z")
print(dt_str)
Основные спецификаторы формата для часового пояса:
| Формат | Описание |
|---|---|
| %Y-%m-%d | Год-месяц-день |
| %H:%M:%S | Часы:Минуты:Секунды |
| %Z | Аббревиатура часового пояса (например, MSK) |
| %z | Смещение от UTC в формате ±HHMM (например, +0300) |
Для текущего времени с часовым поясом:
from datetime import datetime
from zoneinfo import ZoneInfo
dt_now = datetime.now(ZoneInfo("Europe/Moscow"))
dt_str = dt_now.strftime("%Y-%m-%d %H:%M:%S %Z%z")
Объект должен быть «aware»; иначе %Z и %z будут пустыми или некорректными.
Преобразование datetime в ISO 8601 строку

В Python для конвертации объектов datetime в строки формата ISO 8601 используется метод isoformat(). Он возвращает строку вида YYYY-MM-DDTHH:MM:SS.mmmmmm, где символ T отделяет дату от времени.
Пример использования:
from datetime import datetime
dt = datetime(2025, 9, 14, 18, 30, 45)
iso_str = dt.isoformat()
print(iso_str) # 2025-09-14T18:30:45
Для включения часового пояса можно использовать объект datetime с tzinfo. Метод isoformat() корректно добавит смещение, например +03:00:
from datetime import timezone, timedelta
dt = datetime(2025, 9, 14, 18, 30, 45, tzinfo=timezone(timedelta(hours=3)))
print(dt.isoformat()) # 2025-09-14T18:30:45+03:00
Если требуется отделить дату и время без микросекунд, можно использовать параметр timespec:
dt.isoformat(timespec='seconds') вернёт строку без миллисекунд, например 2025-09-14T18:30:45.
Для строгого соответствия стандарту ISO 8601 в JSON или API рекомендуется явно указывать timespec и использовать объекты с часовым поясом, чтобы избежать неоднозначности при передаче времени между разными системами.
Форматирование datetime с миллисекундами или микросекундами

В Python объект datetime содержит атрибут microsecond, который позволяет работать с долями секунды. Для преобразования datetime в строку с миллисекундами используют метод strftime с форматной последовательностью %f, которая возвращает микросекунды (6 цифр). Чтобы получить миллисекунды, достаточно взять первые три цифры результата.
from datetime import datetime
now = datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
print(formatted) # 2025-09-14 13:45:12.123
Для микросекунд используют полное значение %f без обрезки:
formatted_micro = now.strftime("%Y-%m-%d %H:%M:%S.%f")
print(formatted_micro) # 2025-09-14 13:45:12.123456
Важно учитывать, что strftime не добавляет ведущие нули к миллисекундам или микросекундам: они уже присутствуют в формате %f, что гарантирует фиксированную длину 3 или 6 цифр соответственно.
При необходимости использовать разделители или нестандартный формат, можно комбинировать строки с срезами, например:
formatted_custom = f"{now:%Y-%m-%d %H:%M:%S}.{now.microsecond // 1000:03d}"
print(formatted_custom) # 2025-09-14 13:45:12.123
Такой подход обеспечивает точность до миллисекунд и удобен для логирования, временных меток и передачи данных в JSON или базы данных, где требуются фиксированные дробные секунды.
Преобразование текущего времени в строку с пользовательским шаблоном

Пример получения текущей даты и времени:
from datetime import datetime
now = datetime.now()
Создание строки с пользовательским шаблоном:
formatted = now.strftime("%d-%m-%Y %H:%M:%S")
print(formatted)
Популярные элементы шаблона:
%Y– год с четырьмя цифрами (например, 2025)%m– месяц с ведущим нулем (01–12)%d– день месяца с ведущим нулем (01–31)%H– часы в 24-часовом формате (00–23)%M– минуты (00–59)%S– секунды (00–59)%f– микросекунды (000000–999999)
Примеры нестандартного форматирования:
- Только дата:
now.strftime("%d/%m/%Y")→14/09/2025 - Часы и минуты:
now.strftime("%H:%M")→15:42 - Дата с названием месяца:
now.strftime("%d %B %Y")→14 Сентябрь 2025 - Полная метка времени с микросекундами:
now.strftime("%Y-%m-%d %H:%M:%S.%f")→2025-09-14 15:42:30.123456
Рекомендации при использовании шаблонов:
- Используйте явные элементы шаблона, чтобы избежать ошибок локализации.
- Для логов и временных меток рекомендуется формат
%Y-%m-%d %H:%M:%Sдля упрощения сортировки. - Проверяйте результат
strftimeпри изменении шаблона на разных системах, особенно при локализованных названиях месяцев и дней.
Вопрос-ответ:
Как превратить объект datetime в строку с определённым форматом в Python?
В Python для этого используется метод strftime(). Он позволяет задать шаблон форматирования с помощью специальных кодов, например: %Y для года, %m для месяца и %d для дня. Пример: datetime_obj.strftime(«%Y-%m-%d %H:%M:%S») выдаст строку вида «2025-09-14 18:30:00». Это полезно, если нужно сохранить дату в удобочитаемом виде или передать в файл.
Можно ли преобразовать datetime в строку без отображения времени?
Да, можно указать в методе strftime только те компоненты, которые нужны. Например, если не требуется время, достаточно использовать «%Y-%m-%d», и результат будет строкой с датой без часов, минут и секунд. Это часто используется при логировании или формировании отчётов, где важно только число месяца, месяц и год.
Как сделать так, чтобы строка с датой была в русском формате, например «14 сентября 2025»?
Python позволяет форматировать дату с указанием локали через модуль locale. Сначала нужно установить локаль на русскую с помощью locale.setlocale(locale.LC_TIME, «ru_RU.UTF-8»), а затем использовать strftime с кодом %d %B %Y. Это выдаст строку с названием месяца на русском языке. Такой подход удобен для отображения дат в интерфейсах или отчётах для русскоязычных пользователей.
Есть ли способ быстро преобразовать текущую дату и время в строку без создания объекта datetime вручную?
Да, можно использовать метод now() из модуля datetime для получения текущей даты и времени, а затем сразу применить strftime. Например: datetime.datetime.now().strftime(«%Y-%m-%d %H:%M:%S»). Этот вариант подходит для журналирования событий или отметки времени при сохранении данных.
Почему при преобразовании datetime в строку иногда получаются неправильные значения часов или даты?
Чаще всего это связано с часовым поясом. Объекты datetime могут быть «наивными» (без информации о часовой зоне) или «осведомлёнными» (с таймзоной). Если объект наивный, strftime использует локальное время системы, что может не совпадать с ожидаемым. Для корректного отображения нужно убедиться, что datetime создан с правильной временной зоной или выполнить преобразование с помощью методов astimezone().
