Дата и время

В Python дата и время обычно используется в следующих формах:

  • Модуль datetime:
    • datatime — основной класс объектов времени. Объект datatime может быть по отношению к часовому поясу «naive» или «aware».
    • timedelta — класс интервала времени.
  • Модуль time — работа с временем в стиле Unix time_t (время выражается числом секунд с определенного момента, но имеет тип float — целая часть — число секунд, дробная — доли секунды).
  • Модуль calendar — функции календаря.
  • Модуль pytz[pip] — данные по часовым поясам.

Дата и время (TZ naive)

from datetime import datetime, timedelta
from time import time

t1 = time() # t1 == 1509532912.9569173

t2 = datetime.now()
# t2 == datetime.datetime(2017, 11, 1, 13, 42, 55, 774096)

t3 = datetime.fromtimestamp(t1)
# t3 == datetime.datetime(2017, 11, 1, 13, 44, 26, 259667)

t4 = datetime(year=2011,month=2,day=3,hour=12,minute=22,second=34)
# t4 == datetime.datetime(2011, 2, 3, 12, 22, 34)

t5 = t4.timestamp() # t5 == 1296724954.0

Дата и время (UTC)

from datetime import datetime, timedelta
import time

t7 = datetime.utcnow()
# t7 == datetime.datetime(2017, 11, 1, 11, 44, 5, 50212)

t7.timestamp() # 1509525851.537214

t8 = time.time() + time.timezone
# t8 == 1509525851.5553064

t9 = datetime.utcfromtimestamp(t8)
# t9 == datetime.datetime(2017, 11, 1, 8, 44, 11, 555306)

Дата и время (TZ aware)

from datetime import datetime, timedelta
import pytz

t_msk = datetime.now(pytz.timezone('Europe/Moscow'))
# t_msk == datetime.datetime(2017, 11, 1, 14, 52, 39, 297530, tzinfo=<DstTzInfo 'Europe/Moscow' MSK+3:00:00 STD>)
t_ber = datetime.now(pytz.timezone('Europe/Berlin'))
# t_ber == datetime.datetime(2017, 11, 1, 12, 52, 50, 681447, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)

(t_msk - t_ber).total_seconds() < 0.001 # True

t_msk.astimezone(pytz.timezone('Europe/Berlin'))
# datetime.datetime(2017, 11, 1, 12, 55, 21, 842909, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)

datetime.now().replace(tzinfo=pytz.timezone('Europe/Berlin'))
# datetime.datetime(2017, 11, 1, 15, 0, 59, 63396, tzinfo=<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>)

Работа с интервалами

Разность двух объектов datetime дает объект timedelta. Также его можно сконструировать через конструктор timedelta. timedelta можно складывать и вычитать, а также умножать на число.

from datetime import datetime, timedelta
from time import time

t1 = datetime(year=2013,month=7,day=15,hour=12,minute=22,second=34)
t2 = datetime.now()

td = t2 - t1
#td == datetime.timedelta(1570, 6567, 748425)

td.total_seconds() # 135654567.748425

t1 + timedelta(days=15)
# datetime.datetime(2013, 7, 30, 12, 22, 34)

timedelta(days=15) *2 
# datetime.timedelta(30)

Для модификации datetime к нему нужно или прибавить/отнять соответствующий timedelta или обновить конкретные поля методом replace.

Даты и время и строки

Для приведения datetime к строке и разбора строки в datetime имеются функции strftime и strptime соответственно.

from datetime import datetime

t1 = datetime(year=2013,month=7,day=15,hour=12,minute=22,second=34)
t1.strftime("%d.%m.%Y %H:%M:%S")
# '15.07.2013 12:22:34'

t2 = datetime.strptime('15.07.2013 12:22:34', "%d.%m.%Y %H:%M:%S")
t2 == t1 # True

Также в пакете python-dateutil[pip] есть метод parse который автоматически угадывает формат.

import dateutil.parser
dateutil.parser.parse('15.07.2013 12:22:34')
# datetime.datetime(2013, 7, 15, 12, 22, 34)

Некоторые популярные форматы

Формат Описание format Пример
%d День месяца %02d 01
%m Месяц числом %02d 08
%y Год (2 знака) %02d 05
%Y Год (4 знака) %04d 2005
%H Час %02d 08
%M Минута %02d 05
%S Секунда %02d 03
%j День года %d 25

Подробное описание форматов даты и времени.

Разбор строк интервалов

Для разбора строк интервалов есть удобный пакет pytimeparse[pip].

Он понимает такие форматы как «10m», «15s» и «2 days, 4:13:02» и возвращает время в секундах.

from datetime import timedelta
from pytimeparse.timeparse import timeparse

timedelta(seconds=timeparse("10m"))
# datetime.timedelta(0, 600)

timedelta(seconds=timeparse("15s"))
# datetime.timedelta(0, 15)

timedelta(seconds=timeparse("2 days, 4:13:02"))
# datetime.timedelta(2, 15182)

Метод sleep

Метод time.sleep выполняет приостановку выполнения скрипта на заданное время в секундах и их долях.

import time

time.sleep(3)

time.sleep(0.23)