На чтение 3 мин Просмотров 17.4к. Опубликовано 14.03.2021
Сегодня рассмотрим два метода strftime и strptime из стандартной библиотеки datetime в языке программирования Python.
Содержание
- Описание формата strftime
- Использование strftime
- Преобразование даты в strftime
- Отображение миллисекунд
- Описание формата strptime
- Использование метода strptime
- Заключениеы
Описание формата strftime
Кратко говоря, strftime преобразует объект date в строковую дату.
Это выглядит так: dateobject.strftime(format).
«Format» — это желаемый формат строки даты, который хочет получить пользователь. Формат строится с использованием кодов, приведенных ниже:
- %a — будний день сокращенно (Пн, Вт,…)
- %A — будний день полностью (Понедельник, Вторник,…)
- %w — будний день, как десятичное число (1, 2, 3,…)
- %d — день месяца в числах (01, 02, 03,…)
- %b — месяцы сокращенно (Янв, Фев,…)
- %B — название месяцев полностью (Январь, Февраль,…)
- %m — месяцы в числах (01, 02, 03,…)
- %y — года без века (19, 20, 21)
- %Y — года с веком (2019, 2020, 2021)
- %H — 24 часа в сутки (с 00 до 23)
- %I — 12 часов в сутки (с 01 до 12)
- %p — AM и PM (00-12 и 12-00)
- %M — минуты (от 00 до 59)
- %S — секунды (от 00 до 59)
- %f — миллисекунды (6 десятичных чисел)
Использование strftime
Давайте рассмотрим конкретный пример — преобразование текущего времени в строку даты:
import datetime from datetime import datetime now = datetime.now() print(now)
Вывод программы:
2021-03-07 23:24:11.192196
Давайте теперь преобразуем приведенный выше объект datetime в строку datetime:
now.strftime("%Y-%m-%d %H:%M:%S")
Вывод программы:
Если вы хотите напечатать месяц в качестве сокращенного названия, замените %m на %b, как показано ниже:
now.strftime("%Y-%b-%d %H:%M:%S")
Вывод программы:
И ещё один пример:
now.strftime("%Y/%b/%A %H:%M:%S")
Вывод программы:
'2021/Mar/Sunday 23:16:41'
Преобразование даты в strftime
Преобразование даты в строку очень похоже на преобразование datetime в строку.
Рассмотрим пример — преобразование текущего объекта даты в строку даты:
today = datetime.today() print(today)
Вывод программы:
2021-03-07 23:22:15.341074
Давайте преобразуем приведенный выше объект date в строку даты с помощью метода strftime:
today.strftime("%Y-%m-%d %H:%M:%S")
Вывод программы:
Отображение миллисекунд
Чтобы получить строку даты с миллисекундами, используйте код формата %f в конце, как показано ниже:
today = datetime.today()
today.strftime("%Y-%m-%d %H:%M:%S.%f")
Вывод программы:
'2021-03-07 23:23:50.851344'
Описание формата strptime
Strptime используется для преобразования строки в объект datetime. Тоесть обратное действие методу strftime. Это выглядит так: strptime(date_string, format).
Разберем пример: strptime(«9/23/20», «%d/%m/%y»). Формат «%d/%m/%y» представляет собой соответствующий формат «9/23/20». Результатом приведенной выше команды будет объект datetime.
Формат строится с использованием заранее определенных кодов. Есть много кодов на выбор. Наиболее важные из них были перечислены ранее (смотрите 1 пункт в содержании).
Использование метода strptime
Преобразуем строку даты в объект datetime:
import datetime
datetime.datetime.strptime("09/23/2030 8:28","%m/%d/%Y %H:%M")
Вывод программы:
datetime.datetime(2030, 9, 23, 8, 28)
Заключениеы
На этом всё. Желаю удачи в программировании!
Егор Егоров
Программирую на Python с 2017 года. Люблю создавать контент, который помогает людям понять сложные вещи. Не представляю жизнь без непрерывного цикла обучения, спорта и чувства юмора.
Ссылка на мой github есть в шапке. Залетай.
I am trying to write a program that asks for the user to input the date in the format mm/dd/yyyy and convert it. So, if the user input 01/01/2009, the program should display January 01, 2009. This is my program so far. I managed to convert the month, but the other elements have a bracket around them so it displays January [01] [2009].
date=input('Enter a date(mm/dd/yyy)')
replace=date.replace('/',' ')
convert=replace.split()
day=convert[1:2]
year=convert[2:4]
for ch in convert:
if ch[:2]=='01':
print('January ',day,year )
Thank you in advance!
alecxe
455k116 gold badges1061 silver badges1180 bronze badges
asked Mar 30, 2014 at 1:02
3
Don’t reinvent the wheel and use a combination of strptime() and strftime() from datetime module which is a part of python standard library (docs):
>>> from datetime import datetime
>>> date_input = input('Enter a date(mm/dd/yyyy): ')
Enter a date(mm/dd/yyyy): 11/01/2013
>>> date_object = datetime.strptime(date_input, '%m/%d/%Y')
>>> print(date_object.strftime('%B %d, %Y'))
November 01, 2013
answered Mar 30, 2014 at 1:08
alecxealecxe
455k116 gold badges1061 silver badges1180 bronze badges
0
As a suggestion use dateutil, which infers the format by itself:
>>> from dateutil.parser import parse
>>> parse('01/05/2009').strftime('%B %d, %Y')
'January 05, 2009'
>>> parse('2009-JAN-5').strftime('%B %d, %Y')
'January 05, 2009'
>>> parse('2009.01.05').strftime('%B %d, %Y')
'January 05, 2009'
answered Mar 30, 2014 at 1:15
behzad.nouribehzad.nouri
72.6k18 gold badges123 silver badges121 bronze badges
Split it by the slashes
convert = replace.split('/')
and then create a dictionary of the months:
months = {1:"January",etc...}
and then to display it do:
print months[convert[0]] + day + year
answered Mar 30, 2014 at 1:09
Python поставляется с множеством полезных объектов, которые можно использовать прямо из коробки. Объекты даты являются примерами таких объектов. Типами дат трудно управлять с нуля из-за сложности дат и времени. Однако объекты даты в Python позволяют чрезвычайно легко преобразовывать даты в желаемые строковые форматы.
Форматирование даты в Python – одна из важнейших задач, с которой вы столкнетесь как программист. В разных регионах мира есть разные способы представления даты и времени, поэтому ваша цель как программиста – представить значения даты в удобном для чтения виде.
Например, вам может потребоваться представить значение даты в числовом формате, например «02-23-2018». С другой стороны, вам может потребоваться записать то же значение даты в более длинном текстовом формате, например «23 февраля 2018 г.». В другом сценарии вы можете извлечь месяц в строковом формате из числового значения даты.
В этой статье мы изучим различные типы объектов даты, а также их функции.
Модуль datetime
Модуль datetime в Python, как вы, наверное, догадались, содержит методы, которые можно использовать для работы со значениями даты и времени. Чтобы использовать этот модуль, мы сначала импортируем его с помощью оператора импорта следующим образом:
import datetime
Мы можем представить значения времени с помощью класса time. Атрибуты для класса времени включают час, минуту, секунду и микросекунду.
Аргументы для класса времени необязательны. Хотя, если вы не укажете какой-либо аргумент, вы вернетесь к времени 0, что вряд ли будет тем, что вам нужно большую часть времени.
Например, чтобы инициализировать объект времени со значением 1 час, 10 минут, 20 секунд и 13 микросекунд, мы можем выполнить следующую команду:
t = datetime.time(1, 10, 20, 13)
Чтобы посмотреть время, воспользуемся функцией print:
print(t)
Вывод:
01:10:20.000013
Возможно, вам понадобится увидеть только час, минуту, секунду или микросекунду, вот как вы можете это сделать:
print('hour:', t.hour)
Вывод:
hour: 1
Минуты, секунды и микросекунды для указанного выше времени можно получить следующим образом:
print('Minutes:', t.minute)
print('Seconds:', t.second)
print('Microsecond:', t.microsecond)
Вывод:
Minutes: 10 Seconds: 20 Microseconds: 13
Значения календарной даты могут быть представлены через класс date. У экземпляров будут атрибуты года, месяца и дня.
Давайте вызовем метод today, чтобы увидеть сегодняшнюю дату:
import datetime today = datetime.date.today() print(today)
Вывод:
2018-09-15
Код вернет дату на сегодня, поэтому вывод, который вы увидите, будет зависеть от дня, когда вы запускаете вышеуказанный скрипт.
Теперь вызовем метод ctime, чтобы распечатать дату в другом формате:
print('ctime:', today.ctime())
Вывод:
ctime: Sat Sep 15 00:00:00 2018
Метод ctime использует более длинный формат даты и времени, чем в примерах, которые мы видели ранее. Этот метод в основном используется для преобразования времени Unix (количество секунд с 1 января 1970 г.) в строковый формат.
А вот как мы можем отобразить год, месяц и день, используя класс date:
print('Year:', today.year)
print('Month:', today.month)
print('Day :', today.day)
Вывод:
Year: 2018 Month: 9 Day : 15
Преобразование дат в строки с помощью strftime
Теперь, когда вы знаете, как создавать объекты даты и времени, давайте научимся форматировать их в более удобочитаемые строки.
Для этого мы будем использовать метод strftime. Этот метод помогает нам преобразовывать объекты даты в читаемые строки. Он принимает два параметра, как показано в следующем синтаксисе:
time.strftime(format, t)
Первый параметр – это строка формата, а второй параметр – время форматирования, что не является обязательным.
Этот метод также можно использовать напрямую с объектом datetime, как показано в следующем примере:
import datetime
x = datetime.datetime(2018, 9, 15)
print(x.strftime("%b %d %Y %H:%M:%S"))
Вывод:
Sep 15 2018 00:00:00
Для форматирования даты мы использовали следующие символьные строки:
- % b: возвращает первые три символа названия месяца. В нашем примере он вернул «Sep».
- % d: возвращает день месяца от 1 до 31. В нашем примере он вернул «15».
- % Y: возвращает год в четырехзначном формате. В нашем примере он вернул «2018».
- % H: возвращает час. В нашем примере он вернул «00».
- % M: возвращает минуты от 00 до 59. В нашем примере возвращается «00».
- % S: возвращает вторую, от 00 до 59. В нашем примере она вернула «00».
Мы не пропустили время, поэтому все значения времени равны «00». В следующем примере показано, как можно форматировать время:
import datetime
x = datetime.datetime(2018, 9, 15, 12, 45, 35)
print(x.strftime("%b %d %Y %H:%M:%S"))
Вывод:
Sep 15 2018 12:45:35
Полный список кодов символов
Помимо символьных строк, приведенных выше, метод strftime принимает несколько других директив для форматирования значений даты:
- % a: возвращает первые три символа дня недели, например среда.
- % A: возвращает полное название дня недели, например среда.
- % B: возвращает полное название месяца, например, сентябрь.
- % w: возвращает день недели в виде числа от 0 до 6, при этом воскресенье – 0.
- % m: возвращает месяц в виде числа от 01 до 12.
- % p: возвращает AM и PM для времени.
- % y: возвращает год в двузначном формате, то есть без века. Например, «18» вместо «2018».
- % f: возвращает микросекунду от 000000 до 999999.
- % Z: возвращает часовой пояс.
- % z: возвращает смещение по всемирному координированному времени.
- % j: возвращает номер дня в году от 001 до 366.
- % W: возвращает номер недели в году от 00 до 53, при этом понедельник считается первым днем недели.
- % U: возвращает номер недели в году от 00 до 53, при этом воскресенье считается первым днем каждой недели.
- % c: возвращает местную версию даты и времени.
- % x: возвращает локальную версию даты.
- % X: возвращает локальную версию времени.
Рассмотрим следующий пример:
import datetime
x = datetime.datetime(2018, 9, 15)
print(x.strftime('%b/%d/%Y'))
Вывод:
Sep/15/2018
А вот как получить только месяц:
print(x.strftime('%B'))
Вывод:
September
Покажем год:
print(x.strftime('%Y'))
Вывод:
2018
В этом примере мы использовали код формата% Y. Обратите внимание, что Y находится в верхнем регистре. Теперь напишите это в нижнем регистре:
print(x.strftime('%y'))
Вывод:
18
На этот раз век опущен. Как видите, с помощью этих кодов форматирования вы можете представлять дату и время практически в любой форме.
Преобразование строк в даты
Метод strftime помог нам преобразовать объекты даты в более читаемые строки. Метод делает противоположное, то есть принимает строки и преобразует их в объекты даты, понятные Python.
Вот синтаксис метода:
datetime.strptime(string, format)
Строковый параметр – это значение в строковом формате, которое мы хотим преобразовать в формат даты. Параметр формата – это директива, определяющая формат, который должен быть принят датой после преобразования.
Например, предположим, что нам нужно преобразовать строку «9/15/18» в объект datetime.
Сначала импортируем модуль datetime. Мы будем использовать ключевое слово from, чтобы иметь возможность ссылаться на определенные функции модуля без формата точки:
from datetime import datetime
Затем мы можем определить дату в виде строки:
str = '9/15/18'
Python не сможет понять указанную выше строку как datetime, пока мы не преобразуем ее в фактический объект datetime. Мы можем успешно сделать это, вызвав метод strptime.
Выполните следующую команду, чтобы преобразовать строку:
date_object = datetime.strptime(str, '%m/%d/%y')
Теперь вызовем функцию печати, чтобы отобразить строку в формате datetime:
print(date_object)
Вывод:
2018-09-15 00:00:00
Как видите, конвертация прошла успешно!
Вы можете видеть, что косая черта «/» использовалась для разделения различных элементов строки. Это сообщает методу strptime, в каком формате находится наша дата, в нашем случае “/” используется в качестве разделителя.
Но что, если день/месяц/год были разделены знаком «-»? Вот как вы с этим справитесь:
from datetime import datetime str = '9-15-18' date_object = datetime.strptime(str, '%m-%d-%y') print(date_object)
Вывод:
2018-09-15 00:00:00
И снова, благодаря спецификатору формата, метод strptime смог проанализировать нашу дату и преобразовать ее в объект даты.
Заключение
В этой статье мы изучили, как форматировать даты в Python. Мы увидели, как модуль datetime в Python может использоваться для управления значениями даты и времени. Модуль содержит ряд классов, которые можно использовать для этой цели. Например, класс времени используется для представления значений времени, а класс даты – для представления значений календарной даты.
Improve Article
Save Article
Improve Article
Save Article
In this article, we will see how to format date using strftime() in Python. localtime() and gmtime() returns a tuple representing a time and this tuple is converted into a string as specified by the format argument using python time method strftime().
Syntax:
time.strftime(format[, sec])
sec: This is the time in number of seconds to be formatted.
format: This is the directive or format code which would be used to format.
| Directive or format code | Returned Valued | Example |
|---|---|---|
| %Y | Full year with century | 2021,2022 |
| %y | Year without century with zero padded value | 00,01,….21,22…,99 |
| %-y | Year without century | 0,1…,99 |
| %m | Month with zero padded value | 01-12 |
| %-m | Month without zero padded value | 1-12 |
| %B | Full month name | January, February,…, December |
| %b | Short form of month | Jan, Feb,…,Dec |
| %A | Full weekday name | Sunday, Monday,.. |
| %a | Short form of weekday name | Sun, Mon,.. |
| %w | Weekday as decimal value | 0-6 |
| %d | Days with zero padded value | 01-31 |
| %-d | Days with decimal value | 1-31 |
| %H | Hour (24-hour clock) as a zero-padded value. | 00-23 |
| %-H | Hour (24-hour clock) without zero-padded value. | 0,1,…,23 |
| %I | Hour (12-hour clock) as a zero-padded value. | 01-12 |
| %-I | Hour (12-hour clock) without zero-padded value. | 1-12 |
| %M | Mins with zero-padded | 00-59 |
| %-M | Mins without zero padded value | 0-59 |
| %S | Secs with zero padded value | 00-59 |
| %-S | Secs without zero padded value | 0-59 |
| %f | Micro Secs with zero-padded value | 000000 – 999999 |
| %p | Locale’s AM or PM. | AM/PM |
| %j | Day of the year with zero padded value | 001-366 |
| %-j | Day of the year without zero padded value | 1-366 |
| %z | UTC offset in the form +HHMM or -HHMM. | |
| %Z | Time zone name. | |
| %C | Locale’s appropriate date and time | Fri Apr 02 02:09:07 2020 |
| %x | Locale’s appropriate date | 02/04/22 |
| %X | Locale’s appropriate time | 02:04:22 |
| %W | Week number of the year. Monday as first day of week | 00-53 |
| %U | Week number of the year. Sunday as first day of week | 00-53 |
Below are some examples for better understanding.
Example 1:
Python3
from datetime import datetime
time = datetime.now()
print("Without formatting:", time)
print("After formatting:", time.strftime("%b %d, %Y"))
Output
Without formatting: 2022-11-29 12:59:08.088819 After formatting: Nov 29, 2022
Output:
Example 2:
Python3
from datetime import datetime
time = datetime.now()
print("Without formatting:", time)
print("Year", time.strftime("%Y"))
print("Month name", time.strftime("%B"))
print("Day", time.strftime("%d"))
Output:
Example 3:
Python3
from datetime import datetime
time = datetime.now()
print(time.strftime("%m/%d/%y"))
print(time.strftime("%B %d, %Y"))
print(time.strftime("%H:%M:%S"))
Output:
In different regions of the world, different types of date formats are used and for that reason usually, programming languages provide a number of date formats for the developed to deal with. In Python, it is dealt with by using a liberty called DateTime. It consists of classes and methods that can be used to work with data and time values.
Required library
import datetime
The datetime.time method
Time values can be represented using the time class. The attributes for the time class include the hour, minute, second, and microsecond.
Syntax of datetime.time
time(hour, minute, second, microsecond)
Example 1:
Python3
import datetime
tm = datetime.time(2, 25, 50, 13)
print(tm)
Output
02:25:50.000013
Example 2:
There are ranges for the time attributes i.e for seconds we have the range between 0 to 59 and for nanoseconds, range is between 0 to 999999. If the range exceeds, the compiler shows a ValueError. The instance of time class consists of three instance attributes namely hour, minute, second, and microsecond. These are used to get specific information about the time.
Python3
import datetime
tm = datetime.time(1, 50, 20, 133257)
print('Time tm is ',
tm.hour, ' hours ',
tm.minute, ' minutes ',
tm.second, ' seconds and ',
tm.microsecond, ' microseconds')
Output
Time tm is 1 hours 50 minutes 20 seconds and 133257 microseconds
The datetime.date method
The values for the calendar date can be represented via the date class. The date instance consists of attributes for the year, month, and day.
Syntax of datetime.date
date(yyyy, mm, dd)
Example 1:
Python3
import datetime
date = datetime.date(2018, 5, 12)
print('Date date is ', date.day,
' day of ', date.month,
' of the year ', date.year)
Output
Date date is 12 day of 5 of the year 2018
Example 2:
To get today’s date names a method called today() is used and to get all the information in one object (today’s information) ctime() method is used.
Python3
import datetime
tday = datetime.date.today()
daytoday = tday.ctime()
print("The date today is ", tday)
print("The date info. is ", daytoday)
Output
The date today is 2020-01-30 The date info. is Thu Jan 30 00:00:00 2020
Convert string to date using DateTime
Conversion from string to date is many times needed while working with imported data sets from a CSV or when we take inputs from website forms. To do this, Python provides a method called strptime().
Syntax: datetime.strptime(string, format)
Parameters:
- string – The input string.
- format – This is of string type. i.e. the directives can be embedded in the format string.
Example:
Python3
from datetime import datetime
print(datetime.strptime('5/5/2019',
'%d/%m/%Y'))
Output
2019-05-05 00:00:00
Convert dates to strings using DateTime
Date and time are different from strings and thus many times it is important to convert the DateTime to string. For this, we use strftime() method.
Syntax of datetime.strftime
Syntax: datetime.strftime(format, t)
Parameters:
- format – This is of string type. i.e. the directives can be embedded in the format string.
- t – the time to be formatted.
Example 1:
Python3
import datetime
x = datetime.datetime(2018, 5, 12, 2, 25, 50, 13)
print(x.strftime("%b %d %Y %H:%M:%S"))
Output
May 12 2018 02:25:50
Example 2:
The same example can also be written in a different place by setting up the print() method.
Python3
import datetime
x = datetime.datetime(2018, 5, 12, 2, 25, 50, 13)
print(x.strftime("%H:%M:%S %b %d %Y"))
Output
02:25:50 May 12 2018
%H, %M and %S displays the hour, minutes and seconds respectively. %b, %d and %Y displays 3 characters of the month, day and year respectively. Other than the above example the frequently used character code List along with its functionality are:
Frequently used character code in DateTime
- %a: Displays three characters of the weekday, e.g. Wed.
Python3
import datetime
x = datetime.datetime(2018, 5, 12, 2, 25, 50, 13)
print(x.strftime("%a"))
Output
Sat
- %A: Displays name of the weekday, e.g. Wednesday.
Python3
import datetime
x = datetime.datetime(2018, 5, 12, 2, 25, 50, 13)
print(x.strftime("%A"))
Output
Saturday
- %B: Displays the month, e.g. May.
Python3
import datetime
x = datetime.datetime(2018, 5, 12, 2, 25, 50, 13)
print(x.strftime("%B"))
Output
May
- %w: Displays the weekday as a number, from 0 to 6, with Sunday being 0.
Python3
import datetime
x = datetime.datetime(2018, 5, 12, 2, 25, 50, 13)
print(x.strftime("%w"))
Output
6
- %m: Displays month as a number, from 01 to 12.
Python3
import datetime
x = datetime.datetime(2018, 5, 12, 2, 25, 50, 13)
print(x.strftime("%m"))
Output
5
- %p: Define AM/PM for time.
Python3
import datetime
x = datetime.datetime(2018, 5, 12, 2, 25, 50, 13)
print(x.strftime("%p"))
Output
PM
- %y: Displays year in two-digit format, i.e “20” in place of “2020”.
Python3
import datetime
x = datetime.datetime(2018, 5, 12, 2, 25, 50, 13)
print(x.strftime("% y"))
Output
18
- %f: Displays microsecond from 000000 to 999999.
Python3
import datetime
x = datetime.datetime(2018, 5, 12, 2, 25, 50, 13)
print(x.strftime("% f"))
Output
000013
- %j: Displays number of the day in the year, from 001 to 366.
Python3
import datetime
x = datetime.datetime(2018, 5, 12, 2, 25, 50, 13)
print(x.strftime("%f"))
Output
132
И наоборот, метод класса datetime.datetime.strptime() создает объект datetime.datetime() из строки, представляющей дату и время в строке, соответствующей формату.
Смотрите примеры форматирования объектов модуля 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(*(time.strptime(date_string, format)[0:6]))
За исключением случаев, когда формат включает субсекундные компоненты или информацию о смещении часового пояса, которые поддерживаются в конструкторе datetime.datetime.strptime, но отбрасываются time.strptime.
Для объектов datetime.date() не следует использовать коды формата для часов, минут, секунд и микросекунд, поскольку объекты даты не имеют таких значений. Если они все равно используются, то они заменяется 0.
По той же причине обработка строк формата, содержащих кодовые точки Unicode, которые не могут быть представлены в кодировке текущей локали, также зависит от платформы. На некоторых платформах такие кодовые точки сохраняются без изменений в выводе, в то время как на других, метод .strftime() может вызывать исключение UnicodeError или возвращать пустую строку.
Замечания:
- Поскольку формат зависит от текущей локали, необходимо соблюдать осторожность при предположении о выходном значении. Порядок полей будет различаться, например “month/day/year” или “day/month/year”, а выходные данные могут содержать символы Юникода, закодированные с использованием кодировки по умолчанию для локали (например, если текущим языковым стандартом является ja_JP, Кодировка по умолчанию может быть любой из
eucJP,SJISилиutf-8. Используйте функциюlocale.getlocale()для определения кодировки текущей локали. - Метод
.strptime()может анализировать годы во всем диапазоне[1, 9999], но годы< 1000должны быть заполнены нулями до ширины из 4 цифр. - При использовании с методом
.strptime()код форматирования%pвлияет только на поле выходного часа, если код форматирования%Iиспользуется для анализа часа. - В отличие от модуля
time, модульdatetimeне поддерживает високосные секунды. - При использовании с методом
.strptime()код форматирования%fпринимает от одной до шести цифр и ноль справа. Код%fявляется расширением набора символов формата в стандарте C, но реализовано отдельно в объектахdatetimeи поэтому всегда доступно. -
%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)
Для работы с датой и временем в Python 2 и 3 есть отдельный модуль datetime. В отличие от других языков, таких как SQL, в Python нет встроенного типа данных для работы с датой и временем — это достигается путем импорта модуля и созданием объекта. Модуль datetime входит в пакет Python и его не нужно отдельно устанавливать.
Импорт модуля осуществляется следующим путем:
import datetime
Получение текущей даты и времени
Для вывода даты и времени нужно выполнить следующее:
import datetime
day_time = datetime.datetime.now()
print(day_time)
Как видно мы получаем для создания объекта даты и времени используется класс с тем же именем что и модуль datetime.
Когда нужно получить только дату используется класс date:
import datetime
day = datetime.date.today()
print(day)
Получение только времени выполняется через метод time():
import datetime
date_time = datetime.datetime.now().time()
print(date_time, type(date_time))
Каждый из описываемых классов можно импортировать следующим способом:
from datetime import date
from datetime import datetime
print(datetime.now())
print(date.today())
Форматирование и перевод в строку
Для получение части даты или времени можно использовать следующие атрибуты:
- year
- month
- day
- weekday
- hour
- minute
- second
import datetime
# Получение дня от даты
date = datetime.date.today()
print(date.day)
date_time = datetime.datetime.now()
# Получение часа суток от времени
print(date_time.hour)
Так же есть метод strftime, который форматирует даты в нужном формате в строку. Например так мы получим дату в формате, который используется у нас:
import datetime
date = datetime.datetime.today()
print(date.strftime('%d-%m-%Y %H:%M'))
Где:
- %d — день месяца с 1 по 31;
- %m — месяц с 1 по 12;
- %Y — год;
- %H — час в формате 0-24;
- %M — минуты;
- %S — секунды.
Таким же способом можно получить время и дату:
- %c — время и дата;
- %x — дата;
- %X — время.
date = datetime.datetime.today()
print(date.strftime('%x'))
Обратите внимание, что таким способом мы преобразуем объект класса datetime в строку и мы больше не сможем использовать методы по работе с датой (например сравнение):
import datetime
date = datetime.datetime.today()
local_date = date.strftime('%d-%m-%Y %H:%M')
print('Объект класса datetime: ', type(date))
print('Дата преобразованная в строку: ', type(local_date))
print(local_date.day)
Мы получим ошибку так как уже работаем со строкой:
- AttributeError: ‘str’ object has no attribute ‘day’
Выше описаны основные возможности форматирования используя метод strftime(), но их, конечно, больше.
Получения дня недели и название месяца
Можно получить название дня недели или название. Численный вариант эквивалентен следующим значениям:
- 0 — Monday (Понедельник);
- 1 — Tuesday (Вторник);
- 2 — Wednesday (Среда);
- 3 — Thursday (Четверг);
- 4 — Friday (Пятница);
- 5 — Saturday (Суббота);
- 6 — Sunday (Воскресенье).
Следующий пример вернет день недели в виде числа:
date = datetime.datetime.today()
print(date.weekday())
Или получить название:
date = datetime.datetime.today()
print(date.strftime('%A'))
print(date.strftime('%a'))
Где:
- %A — полное название дня недели;
- %a — сокращенное название дня недели;
- %s — представление в виде числа.
Такой же принцип по работе с месяцами, где:
- %B — полное название месяца;
- %b — сокращенное название месяца;
- %m — месяц в виде числа.
Создание объекта даты и времени
Для создания даты используется класс с аргументами date(год, месяц, число):
date = datetime.date(2019, 1, 13)
print(date, type(date))
Можно создать дату и время. В обоих случаях мы можем использовать именованные аргументы если так удобнее:
date_time = datetime.datetime(year = 2019,
month = 2,
day = 4,
hour = 7,
minute = 9,
second = 13 )
print(date_time, type(date_time))
Каждый аргумент времени, по умолчанию, имеет значение 0. Мы так же можем использовать подход выше для получения, например, только года или времени:
date_time = datetime.datetime(year = 2019,
month = 2,
day = 4,
second = 13 )
# Получаем только время
time = date_time.strftime('%X')
print(time, type(time))
date = datetime.date(
year = 2018,
month = 5,
day = 3
)
# Получаем только год
year = date.year
print(year, type(year))
Если вы не укажете год, месяц или день, то получите ошибку т.к. они по умолчанию равны None:
- TypeError: Required argument ‘year’ (pos 1) not found
Есть отдельный класс для создания времени time:
time = datetime.time(12, 33, second=33, microsecond=122)
print(time, type(time))
print(time.hour)
Создание из строк
Используя strptime() можно создавать объект datetime из строки:
date_string = '21 September. 1999'
date_object = datetime.strptime(date_string, '%d %B. %Y')
print(date_object, type(date_object))
Продолжительность времени с timedelta
timedelta — это класс с помощью которого можно установить не дату, как в примерах выше, а продолжительность. Так мы создадим объект с 12 днями и 33 секундами:
duration_time = datetime.timedelta(days = 12, seconds = 33)
print(duration_time, type(duration_time))
Все атрибуты, которые мы можем указывать для этого класса:
- days
- seconds
- microseconds
- milliseconds
- minutes
- hours
Кроме этого мы можем преобразовывать эти объекты в секунды:
duration_time = datetime.timedelta(minutes = 1, seconds = 10)
# Преобразуем в секунды
seconds = duration_time.total_seconds()
print(seconds, type(seconds))
Разница между датами
Мы можем искать разницу между датами получая объект timedelta:
date_now = datetime.datetime.now()
date_tomorrow = datetime.datetime(2019, 12, 29)
# Вычисляем разницу между датами
difference = date_tomorrow - date_now
print(difference, type(difference))
print('Разница только в днях: ', difference.days)
Изменение объектов
Каждый их объектов выше можно изменить. Так мы изменим объект timedelta прибавив часы к минутам:
duration_hours = datetime.timedelta(hours = 1)
duration_minutes = datetime.timedelta(minutes = 10)
result = duration_hours + duration_minutes
print(result, type(result))
С помощью timedelta изменяется и дата. Пример ниже изменяет текущую дату прибавляя к ней 1 день и 1 час:
date_now = datetime.datetime.now()
duration_minutes = datetime.timedelta(days=1, minutes=10)
result = date_now + duration_minutes
print(result, type(result))

Сравнение и условия
Каких либо хитростей в сравнении объектов нет. В следующем примере идет сравнение двух дат с разницей в день:
date_one = datetime.datetime(2017,12,1)
date_two = datetime.datetime(2017,12,2)
if date_two > date_one:
print('{0} больше чем {1}'.format(date_two, date_one))
При этом стоит проверять, что объекты относятся к классу datetime, а не являются строками. В следующем примере мы сравниваем года, но они уже относятся к численным:
date_one = datetime.datetime(2017,12,1)
date_two = datetime.datetime(2017,12,2)
if date_two.year == date_one.year:
print('Год одинаковый. Тип данных: ', type(date_two.year))
Объект timedelta тоже можно сравнивать:
time_one = datetime.timedelta(seconds=2)
time_two = datetime.timedelta(minutes=1)
if time_one < time_two:
print('Pass')

Работа с метками (штампами) timestamp
При работе с API или в Unix системах мы можем увидеть отображение времени в таком формате:
1578238360
Данные числа обозначают количество секунд с 1 января 1970 года. Мы можем конвертировать данное число в понятный формат используя datetime:
timestamp = date.fromtimestamp(1578238360)
print(timestamp)
Так же сработает если мы хотим получить и время:
timestamp = datetime.fromtimestamp(1578238360)
print(timestamp)
Для конвертирования в timestamp используется метод с аналогичным названием:
from datetime import datetime
date_now = datetime.now()
print(date_now.timestamp)
Работа с часовыми поясами
К сожалению у меня нет большого опыта работы с часовыми поясами и примеры ниже не стоит рассматривать как лучшие практики.
Библиотека datetime не хранит часовые пояса, данные о переводах часов (летнее и зимнее время) и високосных секундах. К тому же, некоторые страны, могут изменить время опираясь на локальные ситуации. Эти ситуации опасны, когда идет запись в базу данных. Для вывода в GUI, можно использовать datetime.datetime.now() или высчитывать часовой пояс из базы.
Для записи в базу данных мы можем использовать время UTC и отдельно считать часовой пояс:
utc = datetime.datetime.utcnow()
print(utc)
Следующий пример вычислит разницу времени между UTC и локальным. Насколько я знаю он может не сработать на версиях Python < 3.3:
gmt = datetime.today() - datetime.utcnow()
print(gmt)
Для вычисления других часовых поясов можно использовать стороннюю библиотеку pytz, которая их хранит:
pip install pytz
Вывести все часовые пояса мы можем так:
import pytz
for tz in pytz.all_timezones:
print(tz)
На примере ниже я перевожу локальное время в часовой пояс Киева:
import pytz
from datetime import datetime
tz_kiev = pytz.timezone('Europe/Kiev')
time_kiev = datetime.now(tz_kiev)
print(time_kiev)
…
Теги:
#python
#datetime































