====== Дата и время ======
В 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=)
t_ber = datetime.now(pytz.timezone('Europe/Berlin'))
# t_ber == datetime.datetime(2017, 11, 1, 12, 52, 50, 681447, tzinfo=)
(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=)
datetime.now().replace(tzinfo=pytz.timezone('Europe/Berlin'))
# datetime.datetime(2017, 11, 1, 15, 0, 59, 63396, tzinfo=)
===== Работа с интервалами =====
Разность двух объектов ''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 |
[[https://docs.python.org/3/library/datetime.html?highlight=datetime#strftime-and-strptime-behavior|Подробное описание]] форматов даты и времени.
===== Разбор строк интервалов =====
Для разбора строк интервалов есть удобный пакет ''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)