Дата и время
В 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)