Перейти к содержанию

Обработка форматов даты и времени. Модули time, datetime

Модуль time

Unix-time

Moscow time. Click for Unix:

"Начало эпохи"

Модуль time используется для решения задач, связанных со временем. Время в компьютере хранится как сумма секунд, которые прошли с начала эпохи. Результат на всех Unix-подобных системах будет 1 января 1970 года 00:00. Эта дата связана с написанием первой официальной версии операционной системы UNIX.

import time

## функция для проверки даты начала эпохи
print(time.gmtime(0))

## Ответ: 
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

## сколько секунд прошло с начала эпохи
print(time.time()) # float

Функция sleep

В модуле time есть несколько удобных функций. Одина из них — "уснуть" на указанное количество секунд. В данном случае бесконечно вызывается функция hello() в цикле while, но интерпретатор ждет 3 секунды и начинает заново.

import time
## вывод каждый 3 секунд
def hello():
    print('Привет')

while True:
    hello()
    time.sleep(3)

Как прервать исполнение кода?

Нажмите Ctrl + C, чтобы прекратить!

Замер времени monotonic

В случае, если вам надо измерить время работы части кода, можно воспользоваться функцией monotonic(). • Его главной особенностью является то, что он не может идти назад, если например ОС обновила через интернет свои часы для синхронизации. Функция time в свою очередь спрашивает время в момент запроса (пользовательское время).

import time

## Замеряем время выполнения вычисления
start = time.monotonic()

## Сложное вычисление
number = 2 ** 100000000

## Считаем разницу текущего времени и начала отсчета
elapsed = time.monotonic() - start
print(f'потрачено {elapsed} секунд')

Модуль datetime

Объект даты date

Модуль datetime содержит инструменты для работы с форматами даты и времени. Поддерживаются как стандартные способы представления времени, так и способы более удобные для работы с датами и временными интервалами. Объект date хранит значения года, месяца и дня, которые являются обязательными параметрами для создания

import datetime

## объект date для манипуляций с датами
python_birthday = datetime.date(year=1991, month=2, day=20)
print(python_birthday) # без информации о времени

Объект даты date позволяет обращаться к отдельным своим составляющим.

import datetime

python_birthday = datetime.date(year=1991, month=2, day=20)

print(datetime.date.today())  # сегодня
print(python_birthday.year)  # 1991 - тип 'int'
print(python_birthday.month)  # 2
print(python_birthday.day)  # 20
print(python_birthday.weekday())  # 2 – это среда (нумерация с нуля)

Объект времени time

Для обработки только времени можно использовать объект time. Также как c date, можно обратиться к отдельным частям time.

import datetime

lunch_time = datetime.time(hour=12, minute=15, second=30, microsecond=5005)

print(f'Время обеда {lunch_time}')
print(lunch_time.hour) # 12 часов
print(lunch_time.minute) # 10 минут
print(lunch_time.second) # 30 секунд
print(lunch_time.microsecond) # 5005 микросекунд

Для создания объекта time не обязательно указывать все поля. Достаточно одного или двух.

import datetime

monday_lunch_time = datetime.time(hour=12, minute=15, second=30)
tuesday_lunch_time = datetime.time(hour=12, minute=15)
wednesday_lunch_time = datetime.time(hour=12)

print(
    'Время обеда:', 
    f'понедельник {monday_lunch_time}',
    f'вторник {tuesday_lunch_time}',
    f'среда {wednesday_lunch_time}',
)

Дата и время datetime

А что если нам нужно учитывать как дату, так и время? Для этого есть класс datetime.datetime. Для создания объекта datetime обязательно должны учитываться параметры year, month и day.

import datetime

fifth = datetime.datetime(year=2005, month=5, day=15, hour=5, minute=50,second=50)

print(f'Что произошло в {fifth}?')
print(datetime.datetime.now()) # сегодня

Форматирование времени

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

В примере:

  • %d заменяется на 15 - номер дня в месяце,
  • %m на 05 - номер самого месяца,
  • %Y на 2005 – год.
import datetime

fifth = datetime.datetime(year=2005, month=5, day=15, hour=5, minute=50, second=50)

print(fifth.strftime("Момент, когда все оканчивается на пять: %d.%m.%Y"))
print(f'... в момент времени {fifth.strftime("%H:%M:%S")}')

Обратная операция для метода strftime — это strptime(). Восстанавливает стандартный объект datetime из форматированной даты в виде строки.

new_date = datetime.datetime.strptime('15.05.2005', '%d.%m.%Y')
print(new_date)

Метод combine можно использовать для объединения идентичных объектов времени.

print(datetime.datetime.combine(new_date, lunch_time))

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

new_date -= datetime.datetime(year=1980, month=1, day=1)
print('Разница в днях', new_date, type(new_date))

Задача №5. Ограниченное время

Условие задачи

На вашем сайте создали страницу для регистрации пользователей на предстоящую конференцию. Регистрация должна состояться до определенной даты – 1 сентября 2023. Необходимо проверить дату регистрации участника и сверить эту дату с заданной датой окончания регистрации.

incoming_date = '02-09-2023' # формат даты в РФ - день, месяц, год
Решение
import datetime

# Формат даты в РФ - день, месяц, год
incoming_date = '02-09-2023'
incoming_date_datetime = datetime.datetime.strptime(incoming_date, '%d-%m-%Y')

## Создадим дату завершения регистрации
registration_end_time = datetime.datetime(year=2023, month=9, day=1)

## Проверим дату в условии
if incoming_date_datetime > registration_end_time:
    print('Отказ в регистрации')
else:
    print('Регистрация одобрена')

Промежуточные итоги

  • Модуль time и datetime позволяет формировать объекты времени в Python.