Для работы с датой и временем в 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)
...