Работа с датой и временем: модуль datetime

В этой статье мы разберемся, как работать с датой и временем в Python при помощи модуля datetime. И для начала давайте напишем несколько простых программ, связанных с датой и временем.

Пример 1: Получение текущей даты и времени.

import datetime

datetime_object = datetime.datetime.now()
print(datetime_object)

Когда вы запустите программу, результат будет примерно таким:

2020-06-29 20:30:33.139533

В этом примере мы импортировали модуль datetime с помощью оператора import datetime.

Одним из классов, определенных в модуле datetime, является класс datetime. После импортирования модуля мы использовали метод now() для создания объекта datetime, содержащего текущие локальные дату и время.


Пример 2: Получение текущей даты.

import datetime

date_object = datetime.date.today()
print(date_object)

Когда вы запустите программу, результат будет примерно таким:

2020-06-29

В этой программе мы использовали метод today(), определенный в классе date, чтобы получить объект date, содержащий текущую локальную дату.

Что находится внутри datetime?

Мы можем использовать функцию dir() для получения списка, содержащего все атрибуты модуля datetime.

import datetime

print(dir(datetime))

Когда вы запустите программу, вывод будет следующим:

['MAXYEAR', 'MINYEAR', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'sys', 'time', 'timedelta', 'timezone', 'tzinfo']

Наиболее часто используемыми классами в модуле datetime являются:

  • date
  • time
  • datetime
  • timedelta

Класс datetime.date

Объект date представляет дату (год, месяц и день).

Пример 3: объект date для представления даты.

import datetime

d = datetime.date(2020, 6, 29) 
print(d)

Когда вы запустите программу, вывод будет следующим:

2020-06-29

В приведенном выше примере date()  является конструктором класса date. Конструктор принимает три аргумента: год, месяц и день.

Переменная d — это объект date.

Вы можете создавать объекты класса date, предварительно импортировав модуль datetime, а можете импортировать только класс date из модуля datetime. Вот как это делается:

from datetime import date

a = date(2020, 6, 29)
print(a) # 2020-06-29

Пример 4: Получение текущей даты.

Для получения информации о текущей дате можно воспользоваться методом today().

from datetime import date

today = date.today()

print("Current date =", today)

Когда вы запустите программу, вывод будет следующим:

Current date = 2020-06-29


Пример 5: получение даты из метки времени (timestamp).

Мы также можем создавать объекты date из метки времени (timestamp). Термин timestamp употребляется для обозначения POSIX-времени — количества секунд, прошедшего с 00:00:00 UTC 1 января, 1970 года. Вы можете преобразовать метку времени в дату при помощи метода fromtimestamp().

from datetime import date

timestamp = date.fromtimestamp(1326244364)
print("Date =", timestamp)

Когда вы запустите программу, вывод будет следующим:

Date = 2012-01-11


Пример 6: вывод текущего года, месяца и дня.

Мы легко можем получить год, месяц, день, день недели и т. д. из объекта date. Вот как это делается:

from datetime import date

today = date.today() 

print("Current year:", today.year)
print("Current month:", today.month)
print("Current day:", today.day)

Когда вы запустите программу, результат будет примерно таким:

Current year: 2020

Current month: 6

Current day: 29

Класс datetime.time

Экземпляр класса time представляет собой время (часы, минуты, секунды и микросекунды).

Пример 7: объект time для представления времени.

from datetime import time

# time(hour = 0, minute = 0, second = 0)
a = time()
print("a =", a)

# time(hour, minute and second)
b = time(11, 34, 56)
print("b =", b)

# time(hour, minute and second)
c = time(hour = 11, minute = 34, second = 56)
print("c =", c)

# time(hour, minute, second, microsecond)
d = time(11, 34, 56, 234566)
print("d =", d)

Когда вы запустите программу, вывод будет следующим:

a = 00:00:00

b = 11:34:56

c = 11:34:56

d = 11:34:56.234566


Пример 8: вывод часов, минут, секунд и микросекунд.

После того как вы создадите объект time, вы можете легко получить его атрибуты, такие как часы, минуты и т. д.

from datetime import time

a = time(11, 34, 56)

print("hour =", a.hour)
print("minute =", a.minute)
print("second =", a.second)
print("microsecond =", a.microsecond)

Когда вы запустите программу, вывод будет следующим:

hour = 11

minute = 34

second = 56

microsecond = 0

Обратите внимание, что мы не передали аргумент microsecond. Следовательно, его значение по умолчанию будет равно 0.

Класс  datetime.datetime

Экземпляр класса datetime содержит информацию как о дате, так и о времени.

Пример 9: объект datetime.

from datetime import datetime

#datetime(year, month, day)
a = datetime(2018, 11, 28)
print(a)

# datetime(year, month, day, hour, minute, second, microsecond)
b = datetime(2017, 11, 28, 23, 55, 59, 342380)
print(b)

Когда вы запустите программу, вывод будет следующим:

2018-11-28 00:00:00

2017-11-28 23:55:59.342380

 

Первые три аргумента year, month и day в конструкторе datetime() являются обязательными. Отсутствующие данные будут заполнены нулями по умолчанию.


Пример 10: вывод года, месяца, часа, минуты и метки времени.

from datetime import datetime

a = datetime(2017, 11, 28, 23, 55, 59, 342380)
print("year =", a.year)
print("month =", a.month)
print("hour =", a.hour)
print("minute =", a.minute)
print("timestamp =", a.timestamp())

Когда вы запустите программу, вывод будет следующим:

year = 2017

month = 11

day = 28

hour = 23

minute = 55

timestamp = 1511913359.34238


Пример 11: получение текущего момента времени.

Мы можем получить информацию о текущем моменте времени не только с помощью уже упомянутого метода now(), но и с помощью today().

from datetime import datetime

date = datetime.today()
print(date)

date = datetime.now()
print(date)

Когда вы запустите программу, результат будет примерно таким:

2020-06-29 20:35:33.353184

2020-06-29 20:35:33.356184

Класс datetime.timedelta

Объект timedelta представляет разницу между двумя моментами времени.

Пример 12: разница между двумя моментами времени.

from datetime import datetime, date

t1 = date(year = 2018, month = 7, day = 12)
t2 = date(year = 2017, month = 12, day = 23)
t3 = t1 - t2
print("t3 =", t3)

t4 = datetime(year = 2018, month = 7, day = 12, hour = 7, minute = 9, second = 33)
t5 = datetime(year = 2019, month = 6, day = 10, hour = 5, minute = 55, second = 13)
t6 = t4 - t5
print("t6 =", t6)

print("type of t3 =", type(t3)) 
print("type of t6 =", type(t6))  

Когда вы запустите программу, вывод будет следующим:

t3 = 201 days, 0:00:00

t6 = -333 days, 1:14:20

type of t3 = <class 'datetime.timedelta'>

type of t6 = <class 'datetime.timedelta'>

Обратите внимание, что и t3, и t6 имеют тип <class 'datetime.timedelta'>.


Пример 13: разница между двумя объектами timedelta.

from datetime import timedelta

t1 = timedelta(weeks = 2, days = 5, hours = 1, seconds = 33)
t2 = timedelta(days = 4, hours = 11, minutes = 4, seconds = 54)
t3 = t1 - t2

print("t3 =", t3)

Когда вы запустите программу, вывод будет следующим:

t3 = 14 days, 13:55:39

Здесь мы создали два объекта timedeltat1 и t2, и их разница выводится на экран.


Пример 14:  отрицательный объект timedelta.

from datetime import timedelta

t1 = timedelta(seconds = 33)
t2 = timedelta(seconds = 54)
t3 = t1 - t2

print("t3 =", t3)
print("t3 =", abs(t3))

Когда вы запустите программу, вывод будет следующим:

t3 = -1 day, 23:59:39

t3 = 0:00:21


Пример 15: интервал времени в секундах.

Вы можете получить общее количество секунд объекта timedelta, используя метод total_seconds().

from datetime import timedelta

t = timedelta(days = 5, hours = 1, seconds = 33, microseconds = 233423)
print("total seconds =", t.total_seconds())

Когда вы запустите программу, вывод будет следующим:

total seconds = 435633.233423

Вы также можете найти сумму двух моментов времени, используя оператор +. Кроме того, вы можете умножить и разделить объект timedelta на целые числа и числа с плавающей точкой.

Больше информации о timedelta вы можете найти в документации.

Формат datetime

Представление даты и времени может отличатся в разных странах, организациях и т. д. В США, например, чаще всего используется формат «мм/дд/гггг», тогда как в Великобритании более распространен формат «дд/мм/гггг».

В Python для работы с форматами есть методы strftime() и strptime().

Python strftime() — преобразование объекта datetime в строку

Метод strftime() определен в классах date, datetime и time. Он создает форматированную строку из заданного объекта date, datetime или time.

Пример 16: форматирование даты с использованием метода strftime().

from datetime import datetime

now = datetime.now()

t = now.strftime("%H:%M:%S")
print("time:", t)

s1 = now.strftime("%m/%d/%Y, %H:%M:%S")
# mm/dd/YY H:M:S format
print("s1:", s1)

s2 = now.strftime("%d/%m/%Y, %H:%M:%S")
# dd/mm/YY H:M:S format
print("s2:", s2)

Когда вы запустите программу, результат будет примерно таким:

time: 20:43:57

s1: 06/29/2020, 20:43:57

s2: 29/06/2020, 20:43:57

Здесь %Y, %m, %d, %H и т. д. — коды для определения формата. Метод strftime() принимает один или несколько кодов и возвращает отформатированную строку на его основе.

В приведенной выше программе переменные t, s1 и s2 являются строками.

Основные коды для определения формата:

  • %Y — год [0001, …, 2018, 2019, …, 9999]
  • %m — месяц [01, 02, …, 11, 12]
  • %d — день [01, 02, …, 30, 31]
  • %H — час [00, 01, …, 22, 23]
  • %M — минута [00, 01, …, 58, 59]
  • %S — секунда [00, 01, …, 58, 59]

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

Python strptime()- преобразование строки в  объект datetime

Метод strptime() создает объект datetime из заданной строки (представляющей дату и время).

Пример 17: метод strptime().

from datetime import datetime

date_string = "21 June, 2018"
print("date_string =", date_string)

date_object = datetime.strptime(date_string, "%d %B, %Y")
print("date_object =", date_object)

Когда вы запустите программу, вывод будет следующим:

date_string = 21 June, 2018

date_object = 2018-06-21 00:00:00

Метод strptime() принимает два аргумента:

  1. строка, представляющая дату и время.
  2. формат, определяющий, каким образом части даты и времени расположены в переданной строке.

Кстати, коды %d, %B и %Y используются для обозначения дня, месяца (название месяца в полном виде) и года соответственно.

Перейдите по ссылке чтобы узнать больше о методе strptime().

Обработка часового пояса в Python

Предположим, вы работаете над проектом и должны отображать дату и время в зависимости от часового пояса пользователей. Вместо того, чтобы пытаться обрабатывать часовой пояс самостоятельно, мы предлагаем вам использовать модуль pytZ.

from datetime import datetime
import pytz

local = datetime.now()
print("Local:", local.strftime("%m/%d/%Y, %H:%M:%S"))


tz_NY = pytz.timezone('America/New_York') 
datetime_NY = datetime.now(tz_NY)
print("NY:", datetime_NY.strftime("%m/%d/%Y, %H:%M:%S"))

tz_London = pytz.timezone('Europe/London')
datetime_London = datetime.now(tz_London)
print("London:", datetime_London.strftime("%m/%d/%Y, %H:%M:%S"))

Когда вы запустите программу, результат будет примерно таким:

Local: 06/29/2020, 00:16:45

NY: 06/28/2020, 17:17:00

London: 06/28/2020, 22:17:00

Здесь datetime_NY и datetime_London — это объекты datetime, содержащие текущую дату и время соответствующего часового пояса.