Все объекты 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.
Код | Значение | Пример | Замечания |
%G | ISO 8601 год со столетием, который содержит большую часть недели ISO (%V). | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (8) |
%u | ISO 8601 День недели в виде десятичного числа, где 1 - понедельник. | 1, 2, …, 7 | |
%V | ISO 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
или возвращать пустую строку.
eucJP
, SJIS
или utf-8
. Используйте функцию locale.getlocale()
для определения кодировки текущей локали..strptime()
может анализировать годы во всем диапазоне [1, 9999]
, но годы < 1000
должны быть заполнены нулями до ширины из 4 цифр..strptime()
код форматирования %p
влияет только на поле выходного часа, если код форматирования %I
используется для анализа часа.time
, модуль datetime
не поддерживает високосные секунды..strptime()
код форматирования %f
принимает от одной до шести цифр и ноль справа. Код %f
является расширением набора символов формата в стандарте C, но реализовано отдельно в объектах datetime
и поэтому всегда доступно.Для "наивного" объекта, коды формата %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
заменяется возвращаемым значением, которое должно быть строкой.При использовании метода .strptime()
коды %U
и %W
используются только в вычислениях, если указаны день недели и календарный год %Y
.
Похожий на коды форматирования %U
и %W
, код %V
используется только в вычислениях, когда день недели и год ISO %G
указываются в строке формата .strptime()
. Также обратите внимание, что коды %G
и %Y
не являются взаимозаменяемыми.
При использовании с методом .strptime()
начальный ноль необязателен для форматов %d
, %m
, %H
, %I
, %M
, %S
, %J
, %U
, %W
и %V
. Формат %y
требует начального нуля.
datetime.datetime()
в строку c датой и временем,datetime.datetime()
.datetime.datetime()
в строку для базы данных.datetime.date()
в строку для базы данных.datetime.datetime()
.datetime.date()
.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)