В этом цикле уроков, мы с вами научимся управлять датой и временем в Python. Модуль datetime отвечает за управление временем в Python. На практических примерах, вы поймете, что это довольно просто. Приступаем к практике.
Прежде чем мы окунемся в пучину знаний, создадим пару простеньких программ работающих с датой и временем.
Пример 1.Получение текущей даты и времени Python
import datetime
datetime_now = datetime.datetime.now()
print(datetime_now)
Результат:
2018-05-19 09:26:03.478039
Импортируем модуль datetime с помощью import datetime. Затем вызываем метод now() модуля datetime, для получения текущей даты и времени.
Пример 2. Получить текущую дату python
import datetime
date_now= datetime.date.today()
print(date_now)
В этом примере мы используем метод today() из класса date, что бы получить текущую дату.
Пример 3. Получение текущей даты Python
Мы можем создать объект date, содержащий текущую дату используя метод класса today().
from datetime import date
today = date.today()
print("Текущая дата =", today)
Пример 4. Сегодняшний год месяц и день
Следующий код покажет нам, как легко получить текущий год, месяц, день недели и.т.д.
from datetime import date
today = date.today()
print("Текущий год:", today.year)
print("Текущий месяц:", today.month)
print("Текущий день:", today.day)
Результат:
Текущий год: 2021
Текущий месяц: 6
Текущий день: 10
Пример 5. Текущий час, минута, секунды и миллисекунды
Создаем объект time, и получаем его атрибуты. Обращаю ваше внимание, что мы не передаем microsecond, поэтому его значение будет 0.
from datetime import time
a = time(11, 34, 56)
print("Час=", a.hour)
print("Минута=", a.minute)
print("Секунда=", a.second)
print("Миллисекунда=", a.microsecond)
Результат:
Час= 11
Минута= 34
Секунда= 56
Миллисекунда= 0
Пример 6. Разница между двумя датами и временем
timedelta — объект возвращает разницу между двумя датами.
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'>
Пример 7. Продолжительность времени в секундах
Получаем общее количество секунд в объекте timedelta с помощью функции total_seconds().
from datetime import timedelta
t = timedelta(days = 5, hours = 1, seconds = 33, microseconds = 233423)
print("Всего секунд =", t.total_seconds())
Результат:
Всего секунд = 435633.233423
Мы так же можем найти сумму двух дат с помощью оператора +. По мимо этого, мы можем так же делить и умножать объект timedelta на целые и дробные числа.
Формат получения даты
Я думаю вы отлично понимаете, что в разных странах разный формат даты и времени. Если наиболее распространенным форматом в России является dd/mm/yyyy то например в США mm/dd/yyyy.
Для обработки формата даты, в Python используются функции strftime() и strptime().
Пример 8. Форматирование даты с помощью strftime
from datetime import datetime
# Текущая дата и время
now = datetime.now()
t = now.strftime("%H:%M:%S")
print("Время:", t)
s1 = now.strftime("%m/%d/%Y, %H:%M:%S")
print("s1:", s1)
s2 = now.strftime("%d/%m/%Y, %H:%M:%S")
print("s2:", s2)
Результат:
time: 04:34:52
s1: 06/09/2021, 04:34:52
s2: 09/06/2021, 04:34:52
И так, тут у нас ситуация складывается следующим образом. %Y, %m,%d,%H являются кодом для форматирования strftime().
- %Y — год [0001,….2010,2011,2012,….9999]
- %m — месяц[01,02,03,…12]
- %d — день [01,02,03,…31]
- %H — час [00,01,02,03,…23]
- %M — минуты [00,01,02,…59]
- %S — секунда [00,01,02,03,….59]
Подробнее о функции strftime().
Пример 9. 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)
Метод strptime() принимает в качестве аргумента строку, которая представляет дату и время. Но необходимо учитывать, что название месяца нужно указывать на английском языке. Подробнее о 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 time: 2018-12-20 13:10:44.260462
America/New_York time: 2018-12-20 13:10:44.260462
Europe/London time: 2018-12-20 13:10:44.260462
Методы модуля datetime в Python
Методы | Описание |
datetime.today() | Текущая дата и время |
datetime.fromordinal(ordinal) | дата из числа, представляющего собой количество дней, прошедших с 01.01.1970. |
datetime.now | Текущая дата и время |
datetime.combine | объект datetime из комбинации объектов date и time. |
datetime.strptime | преобразует строку в datetime |
datetime.strftime | |
datetime.date | объект даты (с отсечением времени). |
datetime.time | объект времени (с отсечением даты) |
datetime.replace | возвращает новый объект datetime с изменёнными атрибутами. |
datetime.timetuple | возвращает struct_time из datetime |
datetime.toordinal | количество дней, прошедших с 01.01.1970 |
datetime.timestamp | возвращает время в секундах с начала эпохи. |
datetime.weekday | день недели в виде числа, понедельник - 0, воскресенье - 6 |
datetime.isoweekday | день недели в виде числа, понедельник - 1, воскресенье - 7 |
datetime.isocalendar | кортеж (год в формате ISO, ISO номер недели, ISO день недели). |
datetime.isoformat | красивая строка вида "YYYY-MM-DDTHH:MM:SS.mmmmmm" или, если microsecond == 0, "YYYY-MM-DDTHH:MM:SS" |
datetime.ctime |