Сообщить об ошибке.

Коды форматирования для функций .strftime() и .strptime(). модуля datetime

Все объекты datetime.date(), datetime.datetime() и datetime.time() поддерживают 2 метода преобразования строки в объект даты/времени и наоборот объекта даты/времени - в человекочитаемою строку:

  • метод .strftime(format) создает строку, представляющую дату/время под контролем явной строки формата format.
  • метод .strptime(format) создает соответствующий объект даты/времени из строки, соответствующей формату format.

Строковой аргумент format составляется в соответствии с правилами форматирования даты/времени из кодов, представленных в таблице ниже.

Смотрите примеры форматирования объектов модуля datetime в строки с датой и временем, а так же преобразования из строки в объекты модуля datetime.

Правила форматирования strftime() и strptime().

Ниже приведен список всех кодов форматирования, которые требуются в стандарте языка C 1989 года, они работают на всех платформах со стандартной реализацией C.

КодЗначениеПримерЗамечания
%aСокращенное название дня недели в локали по умолчанию.Sun, Mon, …, Sat (en_US); So, Mo, …, Sa (de_DE)(1)
%AПолное название дня недели в локали по умолчанию.Sunday, Monday, …, Saturday (en_US); Sonntag, Montag, …, Samstag (de_DE)(1)
%wДень недели как число, где 0 это Воскресение и 6 — суббота.0, 1, …, 6
%dДень месяца в виде десятичного числа с нулем.01, 02, …, 31(9)
%bМесяц как сокращенное название в локали по умолчанию.Jan, Feb, …, Dec (en_US);Jan, Feb, …, Dez (de_DE)(1)
%BМесяц как полное название в локали по умолчанию.January, February, …, December (en_US);Januar, Februar, …, Dezember (de_DE)(1)
%mМесяц в виде десятичного числа с добавлением нуля.01, 02, …, 12(9)
%yГод без столетия как десятичное число с нулем.00, 01, …, 99(9)
%YГод с веком как десятичное число.0001, 0002, …, 2013, 2014, …, 9998, 9999(2)
%HЧас (24-часовой формат) в виде десятичного числа с добавлением нуля.00, 01, …, 23(9)
%IЧас (12-часовые часы) в виде десятичного числа с добавлением нуля.01, 02, …, 12(9)
%pЛокальный эквивалент либо AM, либо PM.AM, PM (en_US);am, pm (de_DE)(1), (3)
%MМинута как десятичное число с добавлением нуля.00, 01, …, 59(9)
%SСекунда как дополненное нулями десятичное число.00, 01, …, 59(4), (9)
%fМикросекунда как десятичное число, дополненное нулями слева.000000, 000001, …, 999999(5)
%zСмещение UTC в форме `±HHMM[SS[.ffffff]]` или пустая строка, если объект наивный.(empty), +0000, -0400, +1030, +063415, -030712.345216(6)
%ZИмя часового пояса или пустая строка, если объект наивный.(empty), UTC, EST, CST
%jДень года в виде десятичного числа с нулем.001, 002, …, 366(9)
%UНомер недели в году (воскресенье - первый день недели) в виде десятичного числа с добавлением нуля. Все дни в новом году, предшествующем первому воскресенью, считаются на неделе 0.00, 01, …, 53(7), (9)
%WНомер недели в году (понедельник - первый день недели) в виде десятичного числа. Все дни в новом году, предшествующем первому понедельнику, считаются на неделе 0.00, 01,…, 53(7), (9)
%cСоответствие локали дате и времени.Tue Aug 16 21:30:00 1988 (en_US); Di 16 Aug 21:30:00 1988 (de_DE)(1)
%xСоответствующее представление даты локали.08/16/88 (None);08/16/1988 (en_US);16.08.1988 (de_DE)(1)
%XСоответствующее время локали.21:30:00 (en_US);21:30:00 (de_DE)(1)
%%Буквальный символ '%'.%

Несколько дополнительных директив, не требуемых стандартом C89, включены для удобства. Все эти параметры соответствуют значениям даты ISO 8601.

КодЗначениеПримерЗамечания
%GISO 8601 год со столетием, который содержит большую часть недели ISO (%V).0001, 0002, …, 2013, 2014, …, 9998, 9999(8)
%uISO 8601 День недели в виде десятичного числа, где 1 - понедельник.1, 2, …, 7
%VISO 8601 неделя в виде десятичного числа с понедельником в качестве первого дня недели. Неделя 01 - неделя, содержащая 4 января.01, 02, …, 53(8), (9)

Дополнительные директивы могут быть недоступны на всех платформах при использовании с методом .strftime(). Коды ISO 8601 year и ISO 8601 week не являются взаимозаменяемыми с указанными выше директивами о номере года и недели. Вызов strptime() с неполными или неоднозначными директивами ISO 8601 вызовет исключение ValueError.

Полный набор поддерживаемых кодов формата варьируется в зависимости от платформы, потому что Python вызывает функцию strftime() библиотеки языка С. Чтобы увидеть полный набор кодов формата, поддерживаемых на вашей платформе, обратитесь к документации.

Технические детали.

Вообще, метод d.strftime(fmt) действует как time.strftime() модуля time time.strftime(fmt, d.timetuple()), хотя не все объекты поддерживают метод timetuple().

Использование datetime.datetime.strptime(date_string, format) эквивалентно:

datetime.datetime(*(time.strptime(date_string, format)[0:6]))

За исключением случаев, когда формат включает субсекундные компоненты или информацию о смещении часового пояса, которые поддерживаются в конструкторе datetime.datetime.strptime, но отбрасываются time.strptime.

Для объектов datetime.date() не следует использовать коды формата для часов, минут, секунд и микросекунд, поскольку объекты даты не имеют таких значений. Если они все равно используются, то они заменяется 0.

По той же причине обработка строк формата, содержащих кодовые точки Unicode, которые не могут быть представлены в кодировке текущей локали, также зависит от платформы. На некоторых платформах такие кодовые точки сохраняются без изменений в выводе, в то время как на других, метод .strftime() может вызывать исключение UnicodeError или возвращать пустую строку.

Замечания:

  1. Поскольку формат зависит от текущей локали, необходимо соблюдать осторожность при предположении о выходном значении. Порядок полей будет различаться, например “month/day/year” или “day/month/year”, а выходные данные могут содержать символы Юникода, закодированные с использованием кодировки по умолчанию для локали (например, если текущим языковым стандартом является ja_JP, Кодировка по умолчанию может быть любой из eucJP, SJIS или utf-8. Используйте функцию locale.getlocale() для определения кодировки текущей локали.
  2. Метод .strptime() может анализировать годы во всем диапазоне [1, 9999], но годы < 1000 должны быть заполнены нулями до ширины из 4 цифр.
  3. При использовании с методом .strptime() код форматирования %p влияет только на поле выходного часа, если код форматирования %I используется для анализа часа.
  4. В отличие от модуля time, модуль datetime не поддерживает високосные секунды.
  5. При использовании с методом .strptime() код форматирования %f принимает от одной до шести цифр и ноль справа. Код %f является расширением набора символов формата в стандарте C, но реализовано отдельно в объектах datetime и поэтому всегда доступно.
  6. Для "наивного" объекта, коды формата %z и %Z заменяются пустыми строками.
    Для "осведомленного объекта":

    • %z - utcoffset() преобразуется в строку вида ±HHMM[SS[.ffffff]], где HH - это двухзначная строка, указывающая количество часов смещения UTC, MM - двузначная строка, указывающая номер смещения UTC. Минут, SS - это двузначная строка, указывающая количество секунд смещения UTC, а ffffff - это шестизначная строка, указывающая число микросекунд смещения UTC. Часть ffffff опускается, когда смещение составляет целое число секунд, а часть ffffff и SS опускается, когда смещение составляет целое число минут. Например, если utcoffset() возвращает timedelta(hours=-3, minutes=-30), то %z заменяется строкой '-0330'.
    • %Z - Если tzname() возвращает None, то %Z заменяется пустой строкой. В противном случае %Z заменяется возвращаемым значением, которое должно быть строкой.
  7. При использовании метода .strptime() коды %U и %W используются только в вычислениях, если указаны день недели и календарный год %Y.

  8. Похожий на коды форматирования %U и %W, код %V используется только в вычислениях, когда день недели и год ISO %G указываются в строке формата .strptime(). Также обратите внимание, что коды %G и %Y не являются взаимозаменяемыми.

  9. При использовании с методом .strptime() начальный ноль необязателен для форматов %d, %m, %H, %I, %M, %S, %J, %U, %W и %V. Формат %y требует начального нуля.


Примеры форматирования строки и преобразования из строки.

Форматирования datetime.datetime() в строку c датой и временем:

>>> import datetime
>>> dt = datetime.datetime.now()
>>> dt.strftime('%H:%M - %m.%d.%Y года')
# '09:56 - 05.06.2020 года'
>>> dt.strftime('%H часов %M минут %m.%d.%Y года')
# '09 часов 56 минут 05.06.2020 года'
>>> dt.strftime('%m/%d/%y')
# '05/06/20'
>>> dt.strftime('%Y-%m-%d')
# '2020-05-06'

# форматирование даты при помощи метода str.format()
>>> 'День: {0:%d}, Месяц: {0:%B}, время: {0:%H:%M}.'.format(dt)
# 'День: 06, Месяц: May, время: 09:56.'

# форматирование даты при помощи f-строк
f'День: {dt:%d}, Месяц: {dt:%B}, время: {dt:%H:%M}.'
# 'День: 06, Месяц: May, время: 09:56.'

Преобразование строки с датой и временем в объект datetime.datetime():

>>> import datetime
>>> date_str = 'Fri, 24 Apr 2021 16:22:54 +0000'
>>> format = '%a, %d %b %Y %H:%M:%S +0000'
>>> datetime.datetime.strptime(date_str, format)
# datetime.datetime(2021, 4, 24, 16, 22, 54)

>>> date_str = '24.12.2020 16:22'
>>> format = '%d.%m.%Y %H:%M'
>>> datetime.datetime.strptime(date_str, format)
# datetime.datetime(2020, 12, 24, 16, 22)

Преобразование datetime.datetime() в строку для базы данных:

>>> import datetime
>>> datetime.datetime.now().isoformat()
# '2020-12-17T19:53:49.680857'

Преобразование datetime.date() в строку для базы данных:

>>> import datetime
>>> datetime.date.today().isoformat()
# '2020-05-05'
>>> date = datetime.date(2021, 12, 4).isoformat()
>>> date
# '2021-12-04'

Преобразование строки из базы данных в datetime.datetime():

>>> import datetime
>>> line_db = '2011-11-04'
>>> datetime.datetime.fromisoformat(line_db)
# datetime.datetime(2011, 11, 4, 0, 0)

>>> line_db = '2011-11-04T00:05:23'
>>> datetime.datetime.fromisoformat(line_db)
# datetime.datetime(2011, 11, 4, 0, 5, 23)

>>> line_db = '2011-11-04 00:05:23.283'
>>> datetime.datetime.fromisoformat(line_db)
# datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)

>>> line_db = '2011-11-04T00:05:23+04:00'
>>> datetime.datetime.fromisoformat(line_db)   
# datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))

Преобразование строки из базы данных в datetime.date()`:

>>> from datetime import date
>>> line_db = '2021-12-06'
>>> date.fromisoformat(line_db)
# datetime.date(2021, 12, 6)