datetime — Основные типы дат и времени
Исходный код: Lib/datetime.py
Модуль datetime предоставляет классы для работы с датами и временем.
Хотя поддерживается арифметика дат и времени, основное внимание в реализации уделяется эффективному извлечению атрибутов для форматирования и обработки вывода.
См. также
Объекты Aware и Naive
Объекты даты и времени можно классифицировать как «aware» (осознанные) или «naive» (неосознанные) в зависимости от того, содержат ли они информацию о часовом поясе.
При наличии достаточных знаний о применяемых алгоритмических и политических корректировках времени, таких как информация о часовом поясе и летнее время, объект aware может определить своё положение относительно других aware объектов. Объект aware представляет конкретный момент во времени, который не подлежит толкованию. 1
Объект naive не содержит достаточной информации, чтобы однозначно определить своё положение относительно других объектов даты/времени. Является ли объект naive временем Координированного универсального времени (UTC), местным временем или временем в другом часовом поясе — полностью зависит от программы, точно так же, как и то, представляет ли определённое число метры, мили или массу. Naive объекты просты в понимании и использовании, но при этом игнорируют некоторые аспекты реальности.
Для приложений, требующих aware объектов, datetime и time объекты имеют необязательный атрибут информации о часовом поясе, tzinfo, который может быть установлен в экземпляр подкласса абстрактного класса tzinfo. Эти объекты tzinfo содержат информацию об отклонении от UTC, имени часового пояса и о том, действует ли летнее время.
Модуль datetime предоставляет только один конкретный класс tzinfo, класс timezone. Класс timezone может представлять простые часовые пояса с фиксированными смещениями от UTC, например, сам UTC или североамериканские часовые пояса EST и EDT. Поддержка часовых поясов с более подробными настройками зависит от приложения. Правила корректировки времени по всему миру носят скорее политический, чем рациональный характер, часто меняются, и нет стандарта, подходящего для каждого приложения, кроме UTC.
Константы
Модуль datetime экспортирует следующие константы:
Доступные типы
-
class datetime.date -
Идеализированная простая дата, предполагающая, что календарь Григорианского типа всегда был и всегда будет в силе. Атрибуты:
year,monthиday.
-
class datetime.time -
Идеализированное время, независимое от конкретного дня, предполагающее, что каждый день содержит ровно 24*60*60 секунд. (Понятие «високосных секунд» здесь отсутствует.) Атрибуты:
hour,minute,second,microsecondиtzinfo.
-
class datetime.datetime -
Сочетание даты и времени. Атрибуты:
year,month,day,hour,minute,second,microsecondиtzinfo.
-
class datetime.timedelta -
Длительность, выражающая разницу между двумя экземплярами
date,timeилиdatetimeс точностью до микросекунды.
-
class datetime.tzinfo -
Абстрактный базовый класс для объектов информации о часовом поясе. Они используются классами
datetimeиtimeдля предоставления настраиваемого понятия корректировки времени (например, для учёта часового пояса и/или летнего времени).
-
class datetime.timezone -
Класс, реализующий абстрактный базовый класс
tzinfoкак фиксированное смещение от UTC.Новое в версии 3.2.
Объекты этих типов неизменяемы.
Взаимосвязи между подклассами:
object
timedelta
tzinfo
timezone
time
date
datetime
Общие свойства
Типы date, datetime, time и timezone обладают следующими общими характеристиками:
- Объекты этих типов неизменяемы.
- Объекты этих типов хешируются, что означает, что они могут использоваться в качестве ключей словарей.
- Объекты этих типов поддерживают эффективное сериализацию с помощью модуля
pickle.
Определение, является ли объект осознанным или не осознанным
Объекты типа date всегда не осознанные.
Объект типа time или datetime может быть осознанным или неосознанным.
Объект типа datetime d является осознанным, если выполняются оба следующих условия:
-
d.tzinfoне равноNone -
d.tzinfo.utcoffset(d)не возвращаетNone
В противном случае d является неосознанным.
Объект типа time t является осознанным, если выполняются оба следующих условия:
-
t.tzinfoне равноNone -
t.tzinfo.utcoffset(None)не возвращаетNone.
В противном случае t является неосознанным.
Различие между осознанным и неосознанным не применяется к объектам типа timedelta.
Объекты timedelta
Объект timedelta представляет собой продолжительность, разницу между двумя датами или временами.
-
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) -
Все аргументы необязательны и по умолчанию равны
0. Аргументы могут быть целыми или дробными числами, положительными или отрицательными.Внутренне хранятся только days, seconds и microseconds. Аргументы преобразуются в эти единицы:
- Миллисекунда преобразуется в 1000 микросекунд.
- Минута преобразуется в 60 секунд.
- Час преобразуется в 3600 секунд.
- Неделя преобразуется в 7 дней.
и дни, секунды и микросекунды затем приводятся к виду, который гарантирует уникальность представления, с
0 <= microseconds < 1000000-
0 <= seconds < 3600*24(количество секунд в одном дне) -999999999 <= days <= 999999999
Следующий пример иллюстрирует, как любые аргументы, кроме days, seconds и microseconds, «сливаются» и приводятся к этим трём атрибутам:
>>> from datetime import timedelta >>> delta = timedelta( ... days=50, ... seconds=27, ... microseconds=10, ... milliseconds=29000, ... minutes=5, ... hours=8, ... weeks=2 ... ) >>> # Only days, seconds, and microseconds remain >>> delta datetime.timedelta(days=64, seconds=29156, microseconds=10)
Если какой-либо аргумент является числом с плавающей точкой и есть дробные микросекунды, дробные микросекунды, оставшиеся от всех аргументов, объединяются, и их сумма округляется до ближайшей микросекунды с использованием правила округления «округлять до ближайшего целого, в случае равенства — к чётному». Если ни один аргумент не является числом с плавающей точкой, процесс преобразования и приведения к каноническому виду является точным (никакая информация не теряется).
Если нормализованное значение дней выходит за указанный диапазон, поднимается исключение
OverflowError.Обратите внимание, что нормализация отрицательных значений может быть на первый взгляд неожиданной. Например:
>>> from datetime import timedelta >>> d = timedelta(microseconds=-1) >>> (d.days, d.seconds, d.microseconds) (-1, 86399, 999999)
Атрибуты класса:
-
timedelta.min -
Наиболее отрицательный объект
timedelta,timedelta(-999999999).
-
timedelta.max -
Наиболее положительный объект
timedelta,timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999).
-
timedelta.resolution -
Наименьшая возможная разница между неравными объектами
timedelta,timedelta(microseconds=1).
Обратите внимание, что из-за нормализации timedelta.max > -timedelta.min. -timedelta.max не может быть представлен как объект timedelta.
Атрибуты экземпляра (только для чтения):
Атрибут | Значение |
|---|---|
| От -999999999 до 999999999 включительно |
| От 0 до 86399 включительно |
| От 0 до 999999 включительно |
Поддерживаемые операции:
Операция | Результат |
|---|---|
| Сумма t2 и t3. После этого t1-t2 == t3 и t1-t3 == t2 верны. (1) |
| Разница между t2 и t3. После этого t1 == t2 - t3 и t2 == t1 + t3 верны. (1)(6) |
| Дельта умножается на целое число. После этого t1 // i == t2 верно, при условии |
В общем случае, t1 * i == t1 * (i-1) + t1 верно. (1) | |
| Дельта умножается на число с плавающей точкой. Результат округляется до ближайшего кратного timedelta.resolution с использованием правила округления «округлять до ближайшего целого, в случае равенства — к чётному». |
| Деление (3) общей продолжительности t2 на единицу интервала t3. Возвращает объект |
| Дельта делится на число с плавающей точкой или целое число. Результат округляется до ближайшего кратного timedelta.resolution с использованием правила округления «округлять до ближайшего целого, в случае равенства — к чётному». |
| Вычисляется целая часть, а остаток (если есть) отбрасывается. Во втором случае возвращается целое число. (3) |
| Вычисляется остаток как объект |
| Вычисляет частное и остаток: |
| Возвращает объект |
| эквивалентно |
| эквивалентно +t, когда |
| Возвращает строку в формате |
| Возвращает строковое представление объекта |
Примечания:
- Это точно, но может переполниться.
- Это точно и не может переполниться.
- Деление на 0 вызывает исключение
ZeroDivisionError. - -timedelta.max не может быть представлен как объект
timedelta. -
Строковые представления объектов
timedeltaнормализуются аналогично их внутреннему представлению. Это приводит к несколько необычным результатам для отрицательных timedelta. Например:>>> timedelta(hours=-5) datetime.timedelta(days=-1, seconds=68400) >>> print(_) -1 day, 19:00:00
- Выражение
t2 - t3всегда будет равно выражениюt2 + (-t3)за исключением случая, когда t3 равноtimedelta.max; в этом случае первое выражение даст результат, а второе переполнится.
Помимо перечисленных выше операций, объекты timedelta поддерживают некоторые сложения и вычитания с объектами date и datetime (см. ниже).
Изменено в версии 3.2: Теперь поддерживается целочисленное и дробное деление объекта timedelta на другой объект timedelta, а также операции нахождения остатка и функция divmod(). Теперь поддерживается дробное деление и умножение объекта timedelta на число с плавающей точкой float.
Сравнения объектов timedelta поддерживаются, с некоторыми оговорками.
Сравнения == или != всегда возвращают bool, независимо от типа сравниваемого объекта:
>>> from datetime import timedelta >>> delta1 = timedelta(seconds=57) >>> delta2 = timedelta(hours=25, seconds=2) >>> delta2 != delta1 True >>> delta2 == 5 False
Для всех других сравнений (например, < и >), когда объект timedelta сравнивается с объектом другого типа, поднимается исключение TypeError:
>>> delta2 > delta1 True >>> delta2 > 5 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: '>' not supported between instances of 'datetime.timedelta' and 'int'
В контексте булевых значений объект timedelta считается истинным тогда и только тогда, когда он не равен timedelta(0).
Методы экземпляра:
-
timedelta.total_seconds() -
Возвращает общее количество секунд, содержащихся в продолжительности. Эквивалентно
td / timedelta(seconds=1). Для других единиц интервала, используйте форму деления непосредственно (например,td / timedelta(microseconds=1)).Обратите внимание, что для очень больших промежутков времени (более 270 лет на большинстве платформ) этот метод может потерять точность микросекунд.
Новое в версии 3.2.
Примеры использования: timedelta
Дополнительный пример нормализации:
>>> # Components of another_year add up to exactly 365 days >>> from datetime import timedelta >>> year = timedelta(days=365) >>> another_year = timedelta(weeks=40, days=84, hours=23, ... minutes=50, seconds=600) >>> year == another_year True >>> year.total_seconds() 31536000.0
Примеры арифметики с timedelta:
>>> from datetime import timedelta >>> year = timedelta(days=365) >>> ten_years = 10 * year >>> ten_years datetime.timedelta(days=3650) >>> ten_years.days // 365 10 >>> nine_years = ten_years - year >>> nine_years datetime.timedelta(days=3285) >>> three_years = nine_years // 3 >>> three_years, three_years.days // 365 (datetime.timedelta(days=1095), 3)
Объекты date
Объект date представляет дату (год, месяц и день) в идеализированном календаре, текущем григорианском календаре, бесконечно продолженном в обоих направлениях.
1 января года 1 называется днём с номером 1, 2 января года 1 называется днём с номером 2 и так далее. 2
-
class datetime.date(year, month, day) -
Все аргументы обязательны. Аргументы должны быть целыми числами в следующих диапазонах:
MINYEAR <= year <= MAXYEAR1 <= month <= 121 <= day <= number of days in the given month and year
Если указан аргумент вне этих диапазонов, генерируется исключение
ValueError.
Другие конструкторы, все методы класса:
-
classmethod date.today() -
Возвращает текущую локальную дату.
Это эквивалентно
date.fromtimestamp(time.time()).
-
classmethod date.fromtimestamp(timestamp) -
Возвращает локальную дату, соответствующую временной метке POSIX, например, возвращаемой функцией
time.time().Это может вызвать
OverflowError, если временная метка находится вне диапазона значений, поддерживаемого платформенной C-функциейlocaltime(), иOSErrorприlocaltime()ошибке. Обычно это ограничено годами с 1970 по 2038. Обратите внимание, что на не-POSIX системах, которые включают високосные секунды в своё представление временной метки, високосные секунды игнорируются методомfromtimestamp().Изменено в версии 3.3: Генерируется
OverflowErrorвместоValueError, если временная метка находится вне диапазона значений, поддерживаемого платформенной C-функциейlocaltime(). ГенерируетсяOSErrorвместоValueErrorприlocaltime()ошибке.
-
classmethod date.fromordinal(ordinal) -
Возвращает дату, соответствующую пролептическому григорианскому порядковому номеру, где 1 января года 1 имеет порядковый номер 1.
Исключение
ValueErrorгенерируется, если1 <= ordinal <= date.max.toordinal(). Для любой даты d,date.fromordinal(d.toordinal()) == d.
-
classmethod date.fromisoformat(date_string) -
Возвращает
date, соответствующую строке date_string, заданной в форматеYYYY-MM-DD:>>> from datetime import date >>> date.fromisoformat('2019-12-04') datetime.date(2019, 12, 4)Это обратное преобразование к
date.isoformat(). Поддерживается только форматYYYY-MM-DD.Введено в версии 3.7.
-
classmethod date.fromisocalendar(year, week, day) -
Возвращает
date, соответствующую дате ISO-календаря, заданной годом, неделей и днём. Это обратное преобразование к функцииdate.isocalendar().Введено в версии 3.8.
Атрибуты класса:
-
date.min -
Самая ранняя представимая дата,
date(MINYEAR, 1, 1).
-
date.max -
Самая поздняя представимая дата,
date(MAXYEAR, 12, 31).
-
date.resolution -
Наименьшая возможная разница между неравными объектами date,
timedelta(days=1).
Атрибуты экземпляра (только для чтения):
-
date.month -
В диапазоне от 1 до 12 включительно.
-
date.day -
В диапазоне от 1 до числа дней в данном месяце данного года.
Поддерживаемые операции:
Операция | Результат |
|---|---|
| date2 удалена от date1 на |
| Вычисляет date2, такая что |
| (3) |
| date1 считается меньше date2, когда date1 предшествует date2 во времени. (4) |
Примечания:
-
date2 сдвигается вперёд во времени, если
timedelta.days > 0, или назад, еслиtimedelta.days < 0. После этогоdate2 - date1 == timedelta.days.timedelta.secondsиtimedelta.microsecondsигнорируются.OverflowErrorгенерируется, еслиdate2.yearбудет меньшеMINYEARили большеMAXYEAR. -
timedelta.secondsиtimedelta.microsecondsигнорируются. - Это точно и не может переполниться. timedelta.seconds и timedelta.microseconds равны 0, и date2 + timedelta == date1 после.
- Другими словами,
date1 < date2тогда и только тогда, когдаdate1.toordinal() < date2.toordinal(). Сравнение дат генерируетTypeError, если другой операнд не является также объектомdate. Однако,NotImplementedвозвращается вместо этого, если у другого операнда есть атрибутtimetuple(). Этот обработчик даёт другим видам объектов дат возможность реализовать сравнение смешанного типа. Если нет, когда объектdateсравнивается с объектом другого типа,TypeErrorгенерируется, если сравнение не является==или!=. В последних случаях возвращаютсяFalseилиTrueсоответственно.
В контексте булевых значений все объекты date считаются истинными.
Методы экземпляра:
-
date.replace(year=self.year, month=self.month, day=self.day) -
Возвращает дату с тем же значением, за исключением тех параметров, которые получили новые значения с помощью указанных ключевых аргументов.
Пример:
>>> from datetime import date >>> d = date(2002, 12, 31) >>> d.replace(day=26) datetime.date(2002, 12, 26)
-
date.timetuple() -
Возвращает
time.struct_time, подобный возвращаемому функциейtime.localtime().Часы, минуты и секунды равны 0, а флаг DST равен -1.
d.timetuple()эквивалентно:time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))
где
yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1— это номер дня в текущем году, начиная с1для 1 января.
-
date.toordinal() -
Возвращает пролептический григорианский порядковый номер даты, где 1 января года 1 имеет порядковый номер 1. Для любого объекта
dated,date.fromordinal(d.toordinal()) == d.
-
date.weekday() -
Возвращает день недели как целое число, где понедельник — 0, а воскресенье — 6. Например,
date(2002, 12, 4).weekday() == 2, среда. См. такжеisoweekday().
-
date.isoweekday() -
Возвращает день недели как целое число, где понедельник — 1, а воскресенье — 7. Например,
date(2002, 12, 4).isoweekday() == 3, среда. См. такжеweekday(),isocalendar().
-
date.isocalendar() -
Возвращает объект именованной кортежи с тремя компонентами:
year,weekиweekday.ISO-календарь — широко используемая разновидность григорианского календаря. 3
Год в ISO-календаре состоит из 52 или 53 полных недель, где неделя начинается с понедельника и заканчивается в воскресенье. Первая неделя ISO-года — это первая (григорианская) неделя года, содержащая четверг. Это неделя номер 1, и ISO-год этого четверга совпадает с его григорианским годом.
Например, 2004 год начинается в четверг, поэтому первая неделя ISO-года 2004 начинается в понедельник, 29 декабря 2003 года, и заканчивается в воскресенье, 4 января 2004 года:
>>> from datetime import date >>> date(2003, 12, 29).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=1) >>> date(2004, 1, 4).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
Изменено в версии 3.9: Результат изменён с кортежа на именованную кортеж.
-
date.isoformat() -
Возвращает строку, представляющую дату в формате ISO 8601,
YYYY-MM-DD:>>> from datetime import date >>> date(2002, 12, 4).isoformat() '2002-12-04'
Это обратная функция
date.fromisoformat().
-
date.__str__() -
Для даты d,
str(d)эквивалентноd.isoformat().
-
date.ctime() -
Возвращает строку, представляющую дату:
>>> from datetime import date >>> date(2002, 12, 4).ctime() 'Wed Dec 4 00:00:00 2002'
d.ctime()эквивалентно:time.ctime(time.mktime(d.timetuple()))
на платформах, где функция C
ctime()(которую вызываетtime.ctime(), но неdate.ctime()) соответствует стандарту C.
-
date.strftime(format) -
Возвращает строку, представляющую дату, с учётом явного формата. Коды формата, относящиеся к часам, минутам или секундам, будут иметь значения 0. Полный список директив форматирования см. в strftime() и strptime() Поведение.
-
date.__format__(format) -
То же, что и
date.strftime(). Это позволяет указать строку формата для объектаdateв строковых литералах с форматированием и при использованииstr.format(). Полный список директив форматирования см. в strftime() и strptime() Поведение.
Примеры использования: date
Пример подсчёта дней до события:
>>> import time >>> from datetime import date >>> today = date.today() >>> today datetime.date(2007, 12, 5) >>> today == date.fromtimestamp(time.time()) True >>> my_birthday = date(today.year, 6, 24) >>> if my_birthday < today: ... my_birthday = my_birthday.replace(year=today.year + 1) >>> my_birthday datetime.date(2008, 6, 24) >>> time_to_birthday = abs(my_birthday - today) >>> time_to_birthday.days 202
Дополнительные примеры работы с date:
>>> from datetime import date
>>> d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
>>> d
datetime.date(2002, 3, 11)
>>> # Methods related to formatting string output
>>> d.isoformat()
'2002-03-11'
>>> d.strftime("%d/%m/%y")
'11/03/02'
>>> d.strftime("%A %d. %B %Y")
'Monday 11. March 2002'
>>> d.ctime()
'Mon Mar 11 00:00:00 2002'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")
'The day is 11, the month is March.'
>>> # Methods for to extracting 'components' under different calendars
>>> t = d.timetuple()
>>> for i in t:
... print(i)
2002 # year
3 # month
11 # day
0
0
0
0 # weekday (0 = Monday)
70 # 70th day in the year
-1
>>> ic = d.isocalendar()
>>> for i in ic:
... print(i)
2002 # ISO year
11 # ISO week number
1 # ISO day number ( 1 = Monday )
>>> # A date object is immutable; all operations produce a new object
>>> d.replace(year=2005)
datetime.date(2005, 3, 11)
Объекты datetime
Объект datetime — это единый объект, содержащий всю информацию из объекта date и объекта time.
Как и объект date, объект datetime предполагает текущий григорианский календарь, расширенный в обоих направлениях; как и объект time, объект datetime предполагает, что в каждом дне ровно 3600*24 секунд.
Конструктор:
-
class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0) -
Аргументы год, месяц и день обязательны. tzinfo может быть
None, или экземпляром подклассаtzinfo. Остальные аргументы должны быть целыми числами в следующих диапазонах:-
MINYEAR <= year <= MAXYEAR, -
1 <= month <= 12, -
1 <= day <= number of days in the given month and year, -
0 <= hour < 24, -
0 <= minute < 60, -
0 <= second < 60, -
0 <= microsecond < 1000000, -
fold in [0, 1].
Если указан аргумент, выходящий за эти пределы, будет поднято исключение
ValueError.Новое в версии 3.6: Добавлен аргумент
fold. -
Другие конструкторы, все методы класса:
-
classmethod datetime.today() -
Возвращает текущее локальное время, с
tzinfoNone.Эквивалентно:
datetime.fromtimestamp(time.time())
См. также
now(),fromtimestamp().Этот метод функционально эквивалентен
now(), но без параметраtz.
-
classmethod datetime.now(tz=None) -
Возвращает текущую локальную дату и время.
Если необязательный аргумент tz равен
Noneили не указан, это какtoday(), но, если возможно, обеспечивает большую точность, чем можно получить из временной меткиtime.time()(например, это может быть возможно на платформах, предоставляющих функцию Cgettimeofday()).Если tz не
None, он должен быть экземпляром подклассаtzinfo, и текущая дата и время преобразуются в часовой пояс tz.
-
classmethod datetime.utcnow() -
Возвращает текущую дату и время UTC, с
tzinfoNone.Это как
now(), но возвращает текущую дату и время UTC в виде простого объектаdatetime. Сознательный объект текущей даты и времени UTC можно получить, вызвавdatetime.now(timezone.utc). См. такжеnow().Предупреждение
Поскольку объекты
datetimeбез часового пояса обрабатываются многими методамиdatetimeкак локальное время, предпочтительно использовать даты и время с часовым поясом для представления времени в UTC. Поэтому рекомендованный способ создания объекта, представляющего текущее время в UTC, — вызовdatetime.now(timezone.utc).
-
classmethod datetime.fromtimestamp(timestamp, tz=None) -
Возвращает локальную дату и время, соответствующую временной метке POSIX, например, возвращаемой
time.time(). Если необязательный аргумент tz равенNoneили не указан, временная метка преобразуется в локальную дату и время платформы, и возвращаемый объектdatetimeявляется простым.Если tz не
None, он должен быть экземпляром подклассаtzinfo, и временная метка преобразуется в часовой пояс tz.fromtimestamp()может вызватьOverflowError, если временная метка выходит за пределы диапазона значений, поддерживаемых функциями платформы Clocaltime()илиgmtime(), иOSErrorпри неудачеlocaltime()илиgmtime(). Обычно это ограничено годами с 1970 по 2038. Обратите внимание, что на не-POSIX системах, которые включают високосные секунды в своё представление временной метки, високосные секунды игнорируютсяfromtimestamp(), и тогда возможно, что две временные метки, отличающиеся на секунду, дадут идентичные объектыdatetime. Этот метод предпочтительнееutcfromtimestamp().Изменено в версии 3.3: Вызывается
OverflowErrorвместоValueError, если временная метка выходит за пределы диапазона значений, поддерживаемых функциями платформы Clocaltime()илиgmtime(). ВызываетсяOSErrorвместоValueErrorпри неудачеlocaltime()илиgmtime().Изменено в версии 3.6:
fromtimestamp()может возвращать экземпляры сfoldравным 1.
-
classmethod datetime.utcfromtimestamp(timestamp) -
Возвращает UTC
datetime, соответствующий временной метке POSIX, сtzinfoNone. (Полученный объект — простой.)Это может вызвать
OverflowError, если временная метка выходит за пределы диапазона значений, поддерживаемых функцией платформы Cgmtime(), иOSErrorпри неудачеgmtime(). Обычно это ограничено годами с 1970 по 2038.Чтобы получить осознанный объект
datetime, вызовитеfromtimestamp():datetime.fromtimestamp(timestamp, timezone.utc)
На POSIX-совместимых платформах это эквивалентно следующему выражению:
datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
за исключением того, что последняя формула всегда поддерживает полный диапазон лет: от
MINYEARдоMAXYEARвключительно.Предупреждение
Поскольку объекты
datetimeбез часового пояса обрабатываются многими методамиdatetimeкак локальное время, предпочтительно использовать даты и время с часовым поясом для представления времени в UTC. Поэтому рекомендованный способ создания объекта, представляющего конкретную временную метку в UTC, — вызовdatetime.fromtimestamp(timestamp, tz=timezone.utc).Изменено в версии 3.3: Вызывается
OverflowErrorвместоValueError, если временная метка выходит за пределы диапазона значений, поддерживаемых функцией платформы Cgmtime(). ВызываетсяOSErrorвместоValueErrorпри неудачеgmtime().
-
classmethod datetime.fromordinal(ordinal) -
Возвращает
datetime, соответствующий пролептическому григорианскому порядковому номеру, где 1 января года 1 имеет порядковый номер 1.ValueErrorгенерируется, если1 <= ordinal <= datetime.max.toordinal(). Часы, минуты, секунды и микросекунды результата равны 0, аtzinfoравноNone.
-
classmethod datetime.combine(date, time, tzinfo=self.tzinfo) -
Возвращает новый объект
datetime, у которого компоненты даты равны заданному объектуdate, а компоненты времени равны заданному объектуtime. Если аргумент tzinfo указан, его значение используется для установки атрибутаtzinfoрезультата, в противном случае используется атрибутtzinfoаргумента time.Для любого объекта
datetimed,d == datetime.combine(d.date(), d.time(), d.tzinfo). Если date — объектdatetime, его компоненты времени и атрибутtzinfoигнорируются.Изменено в версии 3.6: Добавлен аргумент tzinfo.
-
classmethod datetime.fromisoformat(date_string) -
Возвращает
datetime, соответствующий строке date_string в одном из форматов, выдаваемыхdate.isoformat()иdatetime.isoformat().В частности, эта функция поддерживает строки в формате:
YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
где
*может соответствовать любому символу.Внимание
Это не поддерживает разбор произвольных строк ISO 8601 — она предназначена только для обратной операции
datetime.isoformat(). Более полнофункциональный парсер ISO 8601,dateutil.parser.isoparseдоступен в пакете сторонних разработчиков dateutil.Примеры:
>>> from datetime import datetime >>> datetime.fromisoformat('2011-11-04') datetime.datetime(2011, 11, 4, 0, 0) >>> datetime.fromisoformat('2011-11-04T00:05:23') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> datetime.fromisoformat('2011-11-04 00:05:23.283') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000) >>> datetime.fromisoformat('2011-11-04 00:05:23.283+00:00') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc) >>> datetime.fromisoformat('2011-11-04T00:05:23+04:00') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))Введено в версии 3.7.
-
classmethod datetime.fromisocalendar(year, week, day) -
Возвращает
datetime, соответствующий дате ISO-календаря, заданной годом, неделей и днем. Компоненты даты, не связанные с датой, заполняются их стандартными значениями по умолчанию. Это обратная функцияdatetime.isocalendar().Введено в версии 3.8.
-
classmethod datetime.strptime(date_string, format) -
Возвращает
datetime, соответствующий строке date_string, разобранной согласно формату.Это эквивалентно:
datetime(*(time.strptime(date_string, format)[0:6]))
ValueErrorгенерируется, если строка date_string и формат не могут быть обработаны функциейtime.strptime(), или если она возвращает значение, которое не является кортежем времени. Полный список директив форматирования см. в разделе strftime() и strptime().
Атрибуты класса:
-
datetime.min -
Самый ранний представимый
datetime,datetime(MINYEAR, 1, 1, tzinfo=None).
-
datetime.max -
Самый поздний представимый
datetime,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None).
-
datetime.resolution -
Наименьшее возможное различие между неравными объектами
datetime,timedelta(microseconds=1).
Атрибуты экземпляра (только для чтения):
-
datetime.month -
От 1 до 12 включительно.
-
datetime.day -
От 1 до числа дней в данном месяце данного года.
-
datetime.hour -
В
range(24).
-
datetime.minute -
В
range(60).
-
datetime.second -
В
range(60).
-
datetime.microsecond -
В
range(1000000).
-
datetime.tzinfo -
Объект, переданный в качестве аргумента tzinfo конструктору
datetime, илиNone, если он не был передан.
-
datetime.fold -
В
[0, 1]. Используется для устранения неоднозначности временных меток во время повторяющегося интервала. (Повторяющийся интервал возникает, когда часы переводятся назад в конце летнего времени или когда смещение UTC для текущей зоны уменьшается по политическим причинам.) Значение 0 (1) представляет более раннее (позднее) из двух моментов с одинаковым временным представлением.Введено в версии 3.6.
Поддерживаемые операции:
Операция | Результат |
|---|---|
| (1) |
| (2) |
| (3) |
|
- datetime2 — это продолжительность timedelta, удалённая от datetime1, перемещающаяся вперёд во времени, если
timedelta.days> 0, или назад, еслиtimedelta.days< 0. Результат имеет тот же атрибутtzinfo, что и входной datetime, и datetime2 - datetime1 == timedelta после.OverflowErrorгенерируется, если datetime2.year будет меньшеMINYEARили большеMAXYEAR. Обратите внимание, что никакие корректировки часовых поясов не выполняются, даже если входной объект с часовым поясом. - Вычисляет datetime2, такой что datetime2 + timedelta == datetime1. Как и при сложении, результат имеет тот же атрибут
tzinfo, что и входной datetime, и никакие корректировки часовых поясов не выполняются, даже если входной объект с часовым поясом. -
Вычитание
datetimeизdatetimeопределено только в том случае, если оба операнда являются «неявными» или оба являются «явными». Если один «явный», а другой «неявный», то генерируетсяTypeError.Если оба «неявные» или оба «явные» и имеют тот же атрибут
tzinfo, атрибутыtzinfoигнорируются, и результатом является объектtimedeltat, такой чтоdatetime2 + t == datetime1. В этом случае никакие корректировки часовых поясов не выполняются.Если оба «явные» и имеют разные атрибуты
tzinfo,a-bдействует так, как если бы a и b сначала были преобразованы в «неявные» UTC-даты и времени. Результатом является(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())за исключением того, что реализация никогда не переполняется. -
datetime1 считается меньше datetime2, когда datetime1 предшествует datetime2 во времени.
Если один операнд «неявный», а другой «явный», то при попытке сравнения по порядку генерируется
TypeError. При сравнении на равенство «неявные» экземпляры никогда не равны «явным» экземплярам.Если оба операнда «явные» и имеют тот же атрибут
tzinfo, общий атрибутtzinfoигнорируется, и сравниваются базовые даты и время. Если оба операнда «явные» и имеют разные атрибутыtzinfo, операнды сначала корректируются путём вычитания их смещений UTC (полученных изself.utcoffset()).Изменено в версии 3.3: Сравнение на равенство между «явными» и «неявными» экземплярами
datetimeбольше не генерируетTypeError.Примечание
Для того чтобы предотвратить сравнение по адресам объектов, сравнение datetime обычно генерирует
TypeError, если другой операнд не является объектомdatetime. ОднакоNotImplementedвозвращается вместо этого, если у другого операнда есть атрибутtimetuple(). Этот обработчик даёт другим типам объектов дат возможность реализовать сравнение смешанных типов. Если нет, при сравнении объектаdatetimeс объектом другого типа генерируетсяTypeError, если только сравнение не является==или!=. В последних случаях возвращаютсяFalseилиTrueсоответственно.
Методы экземпляров:
-
datetime.date() -
Возвращает объект
dateс тем же годом, месяцем и днём.
-
datetime.time() -
Возвращает объект
timeс тем же часом, минутой, секундой, микросекундой и флагом.tzinfo—None. См. также методtimetz().Изменено в версии 3.6: Значение флага копируется в возвращаемый объект
time.
-
datetime.timetz() -
Возвращает объект
timeс теми же атрибутами часа, минуты, секунды, микросекунды, флага и tzinfo. См. также методtime().Изменено в версии 3.6: Значение флага копируется в возвращаемый объект
time.
-
datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0) -
Возвращает datetime с теми же атрибутами, за исключением тех, для которых заданы новые значения с помощью переданных ключевых аргументов. Обратите внимание, что
tzinfo=Noneможет быть указан для создания «неявного» datetime из «явного» datetime без преобразования данных даты и времени.Добавлен в версии 3.6: Добавлен аргумент
fold.
-
datetime.astimezone(tz=None) -
Возвращает объект
datetimeс новым атрибутомtzinfotz, корректирующим данные даты и времени так, чтобы результат представлял то же UTC-время, что и self, но в местном времени tz.Если предоставлен, tz должен быть экземпляром подкласса
tzinfo, а его методыutcoffset()иdst()не должны возвращатьNone. Если self «неявный», предполагается, что он представляет время в системном часовом поясе.Если вызывается без аргументов (или с
tz=None), предполагается системный локальный часовой пояс для целевого часового пояса. Атрибут.tzinfoпреобразованного экземпляра datetime будет установлен на экземплярtimezoneс именем зоны и смещением, полученными из операционной системы.Если
self.tzinfoравно tz,self.astimezone(tz)равно self: никакая корректировка данных даты и времени не выполняется. В противном случае результатом является местное время в часовом поясе tz, представляющее то же UTC-время, что и self: послеastz = dt.astimezone(tz),astz - astz.utcoffset()будет иметь те же данные даты и времени, что иdt - dt.utcoffset().Если вам нужно просто добавить объект часового пояса tz к datetime dt без корректировки данных даты и времени, используйте
dt.replace(tzinfo=tz). Если вы просто хотите удалить объект часового пояса из «явного» datetime dt без преобразования данных даты и времени, используйтеdt.replace(tzinfo=None).Обратите внимание, что метод
tzinfo.fromutc()по умолчанию может быть переопределён в подклассеtzinfoдля влияния на результат, возвращаемыйastimezone(). Игнорируя случаи ошибок,astimezone()действует так:def astimezone(self, tz): if self.tzinfo is tz: return self # Convert self to UTC, and attach the new time zone object. utc = (self - self.utcoffset()).replace(tzinfo=tz) # Convert from UTC to tz's local time. return tz.fromutc(utc)Изменено в версии 3.3: tz теперь может быть опущено.
Изменено в версии 3.6: Метод
astimezone()теперь может быть вызван для «неявных» экземпляров, которые предполагается представляют системное локальное время.
-
datetime.utcoffset() -
Если
tzinfoравноNone, возвращаетNone, иначе возвращаетself.tzinfo.utcoffset(self), и вызывает исключение, если последнее не возвращаетNoneили объектtimedeltaс величиной меньше одного дня.Изменено в версии 3.7: Смещение от UTC не ограничено целым числом минут.
-
datetime.dst() -
Если
tzinfoравноNone, возвращаетNone, иначе возвращаетself.tzinfo.dst(self), и вызывает исключение, если последнее не возвращаетNoneили объектtimedeltaс величиной меньше одного дня.Изменено в версии 3.7: Смещение DST не ограничено целым числом минут.
-
datetime.tzname() -
Если
tzinfoравноNone, возвращаетNone, иначе возвращаетself.tzinfo.tzname(self), вызывает исключение, если последнее не возвращаетNoneили строковый объект.
-
datetime.timetuple() -
Возвращает
time.struct_time, аналогичный тому, который возвращаетtime.localtime().d.timetuple()эквивалентно:time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, dst))где
yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1— номер дня в текущем году, начиная с1для 1 января. Флагtm_isdstрезультата устанавливается в соответствии с методомdst(): еслиtzinfoравноNoneилиdst()возвращаетNone, тоtm_isdstустанавливается в-1; в противном случае, еслиdst()возвращает ненулевое значение, тоtm_isdstустанавливается в1; иначеtm_isdstустанавливается в0.
-
datetime.utctimetuple() -
Если экземпляр
datetimed является неявным, это то же самое, что иd.timetuple(), за исключением того, чтоtm_isdstпринудительно устанавливается в 0 независимо от того, что возвращаетd.dst(). Для времени UTC летнее время никогда не действует.Если d явный, d нормализуется до времени UTC, вычитанием
d.utcoffset(), и возвращаетсяtime.struct_timeдля нормализованного времени.tm_isdstпринудительно устанавливается в 0. Обратите внимание, что исключениеOverflowErrorможет быть вызвано, если d.year былоMINYEARилиMAXYEARи корректировка UTC приводит к переходу за границу года.Предупреждение
Поскольку неявные объекты
datetimeв методах многихdatetimeрассматриваются как локальное время, предпочтительно использовать явные даты и времена для представления времени в UTC; в результате использованиеutcfromtimetupleможет давать вводящие в заблуждение результаты. Если у вас есть неявныйdatetime, представляющий UTC, используйтеdatetime.replace(tzinfo=timezone.utc)для его преобразования в явный, после чего вы можете использоватьdatetime.timetuple().
-
datetime.toordinal() -
Возвращает пролептический григорианский порядковый номер даты. То же самое, что и
self.date().toordinal().
-
datetime.timestamp() -
Возвращает метку времени POSIX, соответствующую экземпляру
datetime. Возвращаемое значение — этоfloat, аналогичное возвращаемомуtime.time().Неявные экземпляры
datetimeпредполагаются представляющими локальное время, и этот метод полагается на платформную функцию Cmktime()для выполнения преобразования. Посколькуdatetimeподдерживает более широкий диапазон значений, чемmktime()на многих платформах, этот метод может вызватьOverflowErrorдля очень ранних или очень поздних моментов времени.Для явных экземпляров
datetimeвозвращаемое значение вычисляется следующим образом:(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
Добавлено в версии 3.3.
Изменено в версии 3.6: Метод
timestamp()использует атрибутfoldдля устранения неоднозначности моментов времени в повторяющемся интервале.Примечание
Нет метода для получения метки времени POSIX непосредственно из неявного экземпляра
datetime, представляющего время UTC. Если ваше приложение использует эту конвенцию, и часовой пояс вашей системы не установлен на UTC, вы можете получить метку времени POSIX, передавtzinfo=timezone.utc:timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
или вычислив метку времени непосредственно:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
-
datetime.weekday() -
Возвращает день недели как целое число, где понедельник — 0, а воскресенье — 6. То же самое, что и
self.date().weekday(). См. такжеisoweekday().
-
datetime.isoweekday() -
Возвращает день недели как целое число, где понедельник — 1, а воскресенье — 7. То же самое, что и
self.date().isoweekday(). См. такжеweekday(),isocalendar().
-
datetime.isocalendar() -
Возвращает кортеж с тремя компонентами:
year,weekиweekday. То же самое, что иself.date().isocalendar().
-
datetime.isoformat(sep='T', timespec='auto') -
Возвращает строку, представляющую дату и время в формате ISO 8601:
-
YYYY-MM-DDTHH:MM:SS.ffffff, еслиmicrosecondне равно 0 -
YYYY-MM-DDTHH:MM:SS, еслиmicrosecondравно 0
Если
utcoffset()не возвращаетNone, добавляется строка со смещением по UTC:-
YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], еслиmicrosecondне равно 0 -
YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]], еслиmicrosecondравно 0
Примеры:
>>> from datetime import datetime, timezone >>> datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat() '2019-05-18T15:17:08.132263' >>> datetime(2019, 5, 18, 15, 17, tzinfo=timezone.utc).isoformat() '2019-05-18T15:17:00+00:00'
Необязательный аргумент sep (по умолчанию
'T') — разделительный символ длиной в один символ, размещаемый между частями даты и времени в результате. Например:>>> from datetime import tzinfo, timedelta, datetime >>> class TZ(tzinfo): ... """A time zone with an arbitrary, constant -06:39 offset.""" ... def utcoffset(self, dt): ... return timedelta(hours=-6, minutes=-39) ... >>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ') '2002-12-25 00:00:00-06:39' >>> datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat() '2009-11-27T00:00:00.000100-06:39'Необязательный аргумент timespec определяет количество дополнительных компонентов времени для включения (по умолчанию
'auto'). Он может принимать следующие значения:-
'auto': То же, что и'seconds', еслиmicrosecondравно 0, и то же, что и'microseconds', в противном случае. -
'hours': Включитьhourв формате двухзначныхHH. -
'minutes': Включитьhourиminuteв форматеHH:MM. -
'seconds': Включитьhour,minuteиsecondв форматеHH:MM:SS. -
'milliseconds': Включить полное время, но усечь дробную часть секунды до миллисекунд. ФорматHH:MM:SS.sss. -
'microseconds': Включить полное время в форматеHH:MM:SS.ffffff.
Примечание
Исключенные компоненты времени усекаются, а не округляются.
ValueErrorбудет поднято при некорректном аргументе timespec:>>> from datetime import datetime >>> datetime.now().isoformat(timespec='minutes') '2002-12-25T00:00' >>> dt = datetime(2015, 1, 1, 12, 30, 59, 0) >>> dt.isoformat(timespec='microseconds') '2015-01-01T12:30:59.000000'
Добавлено в версии 3.6: Добавлен аргумент timespec.
-
-
datetime.__str__() -
Для экземпляра
datetimed,str(d)эквивалентноd.isoformat(' ').
-
datetime.ctime() -
Возвращает строку, представляющую дату и время:
>>> from datetime import datetime >>> datetime(2002, 12, 4, 20, 30, 40).ctime() 'Wed Dec 4 20:30:40 2002'
Строка результата не будет содержать информацию о часовом поясе, независимо от того, является ли входной объект осознанным или наивным.
d.ctime()эквивалентно:time.ctime(time.mktime(d.timetuple()))
на платформах, где функция C
ctime()(которую вызываетtime.ctime(), но неdatetime.ctime()) соответствует стандарту C.
-
datetime.strftime(format) -
Возвращает строку, представляющую дату и время, управляемую явной строкой формата. Полный список директив форматирования см. в разделе strftime() и strptime() Поведение.
-
datetime.__format__(format) -
То же, что и
datetime.strftime(). Это позволяет указать строку формата для объектаdatetimeв форматированных строковых литералах и при использованииstr.format(). Полный список директив форматирования см. в разделе strftime() и strptime() Поведение.
Примеры использования: datetime
Примеры работы с объектами datetime:
>>> from datetime import datetime, date, time, timezone
>>> # Using datetime.combine()
>>> d = date(2005, 7, 14)
>>> t = time(12, 30)
>>> datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)
>>> # Using datetime.now()
>>> datetime.now()
datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1
>>> datetime.now(timezone.utc)
datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)
>>> # Using datetime.strptime()
>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
>>> dt
datetime.datetime(2006, 11, 21, 16, 30)
>>> # Using datetime.timetuple() to get tuple of all attributes
>>> tt = dt.timetuple()
>>> for it in tt:
... print(it)
...
2006 # year
11 # month
21 # day
16 # hour
30 # minute
0 # second
1 # weekday (0 = Monday)
325 # number of days since 1st January
-1 # dst - method tzinfo.dst() returned None
>>> # Date in ISO format
>>> ic = dt.isocalendar()
>>> for it in ic:
... print(it)
...
2006 # ISO year
47 # ISO week
2 # ISO weekday
>>> # Formatting a datetime
>>> dt.strftime("%A, %d. %B %Y %I:%M%p")
'Tuesday, 21. November 2006 04:30PM'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(dt, "day", "month", "time")
'The day is 21, the month is November, the time is 04:30PM.'
В примере ниже определен подкласс tzinfo, захватывающий информацию о часовом поясе для Кабула, Афганистан, который до 1945 года использовал +4 UTC, а затем — +4:30 UTC:
from datetime import timedelta, datetime, tzinfo, timezone
class KabulTz(tzinfo):
# Kabul used +4 until 1945, when they moved to +4:30
UTC_MOVE_DATE = datetime(1944, 12, 31, 20, tzinfo=timezone.utc)
def utcoffset(self, dt):
if dt.year < 1945:
return timedelta(hours=4)
elif (1945, 1, 1, 0, 0) <= dt.timetuple()[:5] < (1945, 1, 1, 0, 30):
# An ambiguous ("imaginary") half-hour range representing
# a 'fold' in time due to the shift from +4 to +4:30.
# If dt falls in the imaginary range, use fold to decide how
# to resolve. See PEP495.
return timedelta(hours=4, minutes=(30 if dt.fold else 0))
else:
return timedelta(hours=4, minutes=30)
def fromutc(self, dt):
# Follow same validations as in datetime.tzinfo
if not isinstance(dt, datetime):
raise TypeError("fromutc() requires a datetime argument")
if dt.tzinfo is not self:
raise ValueError("dt.tzinfo is not self")
# A custom implementation is required for fromutc as
# the input to this function is a datetime with utc values
# but with a tzinfo set to self.
# See datetime.astimezone or fromtimestamp.
if dt.replace(tzinfo=timezone.utc) >= self.UTC_MOVE_DATE:
return dt + timedelta(hours=4, minutes=30)
else:
return dt + timedelta(hours=4)
def dst(self, dt):
# Kabul does not observe daylight saving time.
return timedelta(0)
def tzname(self, dt):
if dt >= self.UTC_MOVE_DATE:
return "+04:30"
return "+04"
Использование KabulTz из примера выше:
>>> tz1 = KabulTz() >>> # Datetime before the change >>> dt1 = datetime(1900, 11, 21, 16, 30, tzinfo=tz1) >>> print(dt1.utcoffset()) 4:00:00 >>> # Datetime after the change >>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=tz1) >>> print(dt2.utcoffset()) 4:30:00 >>> # Convert datetime to another time zone >>> dt3 = dt2.astimezone(timezone.utc) >>> dt3 datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc) >>> dt2 datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz()) >>> dt2 == dt3 True
Объекты времени
Объект time представляет время суток (местное), независимое от конкретного дня и подлежащее корректировке с помощью объекта tzinfo.
-
class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0) -
Все аргументы необязательны. tzinfo может быть
None, или экземпляром подклассаtzinfo. Остальные аргументы должны быть целыми числами в следующих диапазонах:-
0 <= hour < 24, -
0 <= minute < 60, -
0 <= second < 60, -
0 <= microsecond < 1000000, -
fold in [0, 1].
Если задан аргумент, выходящий за эти пределы, генерируется исключение
ValueError. Все аргументы по умолчанию равны0, за исключением tzinfo, который по умолчанию равенNone. -
Атрибуты класса:
-
time.min -
Самое раннее представимое время
time,time(0, 0, 0, 0).
-
time.max -
Самое позднее представимое время
time,time(23, 59, 59, 999999).
-
time.resolution -
Наименьшее возможное различие между неравными объектами
time,timedelta(microseconds=1), хотя обратите внимание, что арифметические операции с объектамиtimeне поддерживаются.
Атрибуты экземпляра (только для чтения):
-
time.hour -
В
range(24).
-
time.minute -
В
range(60).
-
time.second -
В
range(60).
-
time.microsecond -
В
range(1000000).
-
time.tzinfo -
Объект, переданный в качестве аргумента tzinfo конструктору
time, илиNoneесли он не был передан.
-
time.fold -
В
[0, 1]. Используется для устранения неоднозначности временных меток во время повторяющегося интервала. (Повторяющийся интервал возникает, когда часы переводятся назад в конце летнего времени или когда смещение UTC для текущей зоны уменьшается по политическим причинам.) Значение 0 (1) представляет более ранний (поздний) из двух моментов с тем же представлением временной метки.Добавлена в версии 3.6.
Объекты time поддерживают сравнение time с time, где a считается меньше b, когда a предшествует b во времени. Если один из сравниваемых объектов неявный, а другой — явный, при попытке сравнения по порядку возникает TypeError. Для сравнения на равенство неявные экземпляры никогда не равны явным экземплярам.
Если оба сравниваемых объекта явные и имеют одинаковый атрибут tzinfo, общий атрибут tzinfo игнорируется, и сравниваются базовые времена. Если оба сравниваемых объекта явные и имеют разные атрибуты tzinfo, сравниваемые объекты сначала корректируются путем вычитания их смещений UTC (полученных из self.utcoffset()). Для предотвращения падения смешанных сравнений типов на стандартное сравнение по адресу объекта, когда объект time сравнивается с объектом другого типа, возникает TypeError, если сравнение не == или !=. В последних случаях возвращаются значения False или True соответственно.
Изменено в версии 3.3: Сравнения на равенство явных и неявных экземпляров time больше не вызывают TypeError.
В булевых контекстах объект time всегда рассматривается как истинный.
Изменено в версии 3.5: До Python 3.5 объект time считался ложным, если он представлял полночь в UTC. Это поведение считалось неясным и подверженным ошибкам и было удалено в Python 3.5. См. bpo-13936 для получения подробной информации.
Другой конструктор:
-
classmethod time.fromisoformat(time_string) -
Возвращает объект
time, соответствующий time_string в одном из форматов, выведенных функциейtime.isoformat(). В частности, эта функция поддерживает строки в формате:HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]
Внимание
Эта функция не поддерживает разбор произвольных строк ISO 8601. Она предназначена только для обратной операции функции
time.isoformat().Примеры:
>>> from datetime import time >>> time.fromisoformat('04:23:01') datetime.time(4, 23, 1) >>> time.fromisoformat('04:23:01.000384') datetime.time(4, 23, 1, 384) >>> time.fromisoformat('04:23:01+04:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))Добавлена в версии 3.7.
Методы экземпляра:
-
time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0) -
Возвращает объект
timeсо значениями атрибутов, измененными в соответствии с переданными аргументами. Обратите внимание, что аргументtzinfo=Noneможно указать, чтобы создать неявный объектtimeиз явногоtimeбез преобразования временных данных.Добавлена в версии 3.6: Добавлен аргумент
fold.
-
time.isoformat(timespec='auto') -
Возвращает строку, представляющую время в формате ISO 8601, один из:
-
HH:MM:SS.ffffff, еслиmicrosecondне равно 0 -
HH:MM:SS, еслиmicrosecondравно 0 -
HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], еслиutcoffset()не возвращаетNone -
HH:MM:SS+HH:MM[:SS[.ffffff]], еслиmicrosecondравно 0 иutcoffset()не возвращаетNone
Необязательный аргумент timespec указывает количество дополнительных компонентов времени для включения (по умолчанию
'auto'). Он может быть одним из следующих:-
'auto': То же, что и'seconds'еслиmicrosecondравно 0, то же, что и'microseconds'в противном случае. -
'hours': Включаетhourв форматеHH. -
'minutes': Включаетhourиminuteв форматеHH:MM. -
'seconds': Включаетhour,minuteиsecondв форматеHH:MM:SS. -
'milliseconds': Включает полное время, но усекает дробную часть секунды до миллисекунд.HH:MM:SS.sssформат. -
'microseconds': Включает полное время в форматеHH:MM:SS.ffffff.
Примечание
Исключенные компоненты времени усекаются, а не округляются.
ValueErrorбудет поднято при неверном аргументе timespec.Пример:
>>> from datetime import time >>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes') '12:34' >>> dt = time(hour=12, minute=34, second=56, microsecond=0) >>> dt.isoformat(timespec='microseconds') '12:34:56.000000' >>> dt.isoformat(timespec='auto') '12:34:56'
Добавлено в версии 3.6: Добавлен аргумент timespec.
-
-
time.__str__() -
Для времени t,
str(t)эквивалентноt.isoformat().
-
time.strftime(format) -
Возвращает строку, представляющую время, управляемую явной строкой формата. Полный список директив форматирования см. в Поведение strftime() и strptime().
-
time.__format__(format) -
То же, что и
time.strftime(). Это позволяет указать строку формата для объектаtimeв форматированных строковых литералах и при использованииstr.format(). Полный список директив форматирования см. в Поведение strftime() и strptime().
-
time.utcoffset() -
Если
tzinfoравенNone, возвращаетNone, в противном случае возвращаетself.tzinfo.utcoffset(None), и вызывает исключение, если последнее не возвращаетNoneили объектtimedeltaс величиной меньше одного дня.Изменено в версии 3.7: Смещение UTC не ограничено целым числом минут.
-
time.dst() -
Если
tzinfoравенNone, возвращаетNone, в противном случае возвращаетself.tzinfo.dst(None), и вызывает исключение, если последнее не возвращаетNone, или объектtimedeltaс величиной меньше одного дня.Изменено в версии 3.7: Смещение DST не ограничено целым числом минут.
-
time.tzname() -
Если
tzinfoравенNone, возвращаетNone, в противном случае возвращаетself.tzinfo.tzname(None), или вызывает исключение, если последнее не возвращаетNoneили строковый объект.
Примеры использования: time
Примеры работы с объектом time:
>>> from datetime import time, tzinfo, timedelta
>>> class TZ1(tzinfo):
... def utcoffset(self, dt):
... return timedelta(hours=1)
... def dst(self, dt):
... return timedelta(0)
... def tzname(self,dt):
... return "+01:00"
... def __repr__(self):
... return f"{self.__class__.__name__}()"
...
>>> t = time(12, 10, 30, tzinfo=TZ1())
>>> t
datetime.time(12, 10, 30, tzinfo=TZ1())
>>> t.isoformat()
'12:10:30+01:00'
>>> t.dst()
datetime.timedelta(0)
>>> t.tzname()
'+01:00'
>>> t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
>>> 'The {} is {:%H:%M}.'.format("time", t)
'The time is 12:10.'
Объекты tzinfo
-
class datetime.tzinfo -
Это абстрактный базовый класс, что означает, что этот класс не должен создаваться напрямую. Определите подкласс
tzinfoдля захвата информации о конкретном часовом поясе.Экземпляр (конкретного подкласса)
tzinfoможет быть передан в конструкторы объектовdatetimeиtime. Последние объекты рассматривают свои атрибуты как находящиеся в местном времени, а объектtzinfoподдерживает методы, раскрывающие разницу между местным временем и UTC, название часового пояса и смещение DST, все относительно объекта даты или времени, переданного им.Вам необходимо вывести конкретный подкласс и (по крайней мере) предоставить реализации стандартных методов
tzinfo, необходимых методамdatetime, которые вы используете. Модульdatetimeпредоставляетtimezone, простой конкретный подклассtzinfo, который может представлять часовые пояса с фиксированным смещением от UTC, таким как UTC, или североамериканские EST и EDT.Особое требование для сериализации: Подкласс
tzinfoдолжен иметь метод__init__(), который может вызываться без аргументов, в противном случае его можно сериализовать, но, возможно, не десериализовать снова. Это техническое требование, которое может быть ослаблено в будущем.Конкретный подкласс
tzinfoможет потребовать реализации следующих методов. Точно какие методы необходимы зависит от использования осознанных объектовdatetime. В случае сомнений, просто реализуйте все их.
-
tzinfo.utcoffset(dt) -
Возвращает смещение местного времени от UTC в виде объекта
timedelta, который положителен к востоку от UTC. Если местное время западнее UTC, оно должно быть отрицательным.Это представляет собой общее смещение от UTC; например, если объект
tzinfoпредставляет собой как часовой пояс, так и корректировки DST,utcoffset()должен вернуть их сумму. Если смещение от UTC неизвестно, вернутьNone. В противном случае возвращаемое значение должно быть объектомtimedelta, строго между-timedelta(hours=24)иtimedelta(hours=24)(величина смещения должна быть меньше одного дня). Большинство реализацийutcoffset()вероятно будут выглядеть так или иначе:return CONSTANT # fixed-offset class return CONSTANT + self.dst(dt) # daylight-aware class
Если
utcoffset()не возвращаетNone,dst()тоже не должно возвращатьNone.По умолчанию реализация
utcoffset()вызывает исключениеNotImplementedError.Изменено в версии 3.7: Смещение от UTC не ограничено целым числом минут.
-
tzinfo.dst(dt) -
Возвращает корректировку летнего времени (DST) в виде объекта
timedeltaилиNoneесли информация о DST неизвестна.Возвращает
timedelta(0)если DST не активен. Если DST активен, возвращает смещение как объектtimedelta(см.utcoffset()для подробностей). Обратите внимание, что смещение DST, если применимо, уже добавлено к смещению от UTC, возвращенномуutcoffset(), поэтому нет необходимости обращаться кdst(), если вы не заинтересованы в получении информации о DST отдельно. Например,datetime.timetuple()вызывает свой атрибутtzinfo’s методdst(), чтобы определить, как следует установить флагtm_isdst, аtzinfo.fromutc()вызываетdst()для учета изменений DST при переходе между часовыми поясами.Экземпляр tz подкласса
tzinfo, который моделирует как стандартное, так и летнее время, должен быть согласован в этом смысле:tz.utcoffset(dt) - tz.dst(dt)должно возвращать тот же результат для каждого
datetimedt сdt.tzinfo == tzДля разумных подклассовtzinfo, это выражение дает «стандартное смещение» часового пояса, которое должно зависеть только от географического местоположения, а не от даты и времени. Реализацияdatetime.astimezone()полагается на это, но не может обнаружить нарушения; ответственность программиста — гарантировать это. Если подклассtzinfoне может гарантировать этого, он может переопределить стандартную реализациюtzinfo.fromutc(), чтобы правильно работать сastimezone()независимо.Большинство реализаций
dst()вероятно будут выглядеть так или иначе:def dst(self, dt): # a fixed-offset class: doesn't account for DST return timedelta(0)или:
def dst(self, dt): # Code to set dston and dstoff to the time zone's DST # transition times based on the input dt.year, and expressed # in standard local time. if dston <= dt.replace(tzinfo=None) < dstoff: return timedelta(hours=1) else: return timedelta(0)По умолчанию реализация
dst()вызывает исключениеNotImplementedError.Изменено в версии 3.7: Смещение DST не ограничено целым числом минут.
-
tzinfo.tzname(dt) -
Возвращает имя часового пояса, соответствующее объекту
datetimedt, в виде строки. Ничего о строковых именах не определяется модулемdatetime, и нет требования, чтобы оно имело какое-то особое значение. Например, «GMT», «UTC», «-500», «-5:00», «EDT», «US/Eastern», «America/New York» — все допустимые ответы. ВозвращаетNoneесли строковое имя неизвестно. Обратите внимание, что это метод, а не фиксированная строка, в первую очередь потому, что некоторые подклассыtzinfoзахотят возвращать разные имена в зависимости от конкретного значения dt, переданного, особенно если классtzinfoучитывает летнее время.По умолчанию реализация
tzname()вызывает исключениеNotImplementedError.
Эти методы вызываются объектом datetime или time в ответ на их методы с одинаковыми именами. Объект datetime передает себя в качестве аргумента, а объект time передает None в качестве аргумента. Методы подкласса tzinfo должны быть готовы принять аргумент dt типа None, или класса datetime.
Когда None передается, разработчику класса необходимо решить, какой ответ лучше всего подходит. Например, возвращение None уместно, если класс хочет сказать, что объекты времени не участвуют в протоколах tzinfo. Для utcoffset(None) может быть полезнее вернуть стандартное смещение UTC, так как нет другой конвенции для определения стандартного смещения.
Когда объект datetime передается в ответ на метод datetime, dt.tzinfo — это тот же объект, что и self. Методы tzinfo могут полагаться на это, если пользовательский код не вызывает методы tzinfo напрямую. Цель состоит в том, чтобы методы tzinfo интерпретировали dt как находящийся в местном времени и не беспокоились о объектах в других часовых поясах.
Существует еще один метод tzinfo, который подкласс может переопределить:
-
tzinfo.fromutc(dt) -
Этот метод вызывается из реализации по умолчанию метода
datetime.astimezone(). Когда он вызывается из этого метода,dt.tzinfoравно self, а данные даты и времени dt рассматриваются как выражение времени UTC. Цель методаfromutc()— скорректировать данные даты и времени, вернув эквивалентную дату и время в местном времени self.Большинство подклассов
tzinfoдолжны иметь возможность унаследовать реализацию по умолчанию методаfromutc()без проблем. Она достаточно универсальна для обработки часовых поясов с фиксированным смещением, а также часовых поясов, учитывающих стандартное и летнее время, и даже если времена перехода DST отличаются в разные годы. Примером часового пояса, который реализация по умолчанию методаfromutc()может не обработать корректно во всех случаях, является такой, где стандартное смещение (от UTC) зависит от конкретной даты и времени, что может произойти по политическим причинам. Реализации по умолчанию методовastimezone()иfromutc()могут не дать желаемого результата, если результат относится к часам, которые пересекают момент изменения стандартного смещения.Пропуская код для обработки случаев ошибок, реализация по умолчанию метода
fromutc()действует следующим образом:def fromutc(self, dt): # raise ValueError error if dt.tzinfo is not self dtoff = dt.utcoffset() dtdst = dt.dst() # raise ValueError if dtoff is None or dtdst is None delta = dtoff - dtdst # this is self's standard offset if delta: dt += delta # convert to standard local time dtdst = dt.dst() # raise ValueError if dtdst is None if dtdst: return dt + dtdst else: return dt
В следующей файле tzinfo_examples.py есть примеры классов tzinfo:
from datetime import tzinfo, timedelta, datetime
ZERO = timedelta(0)
HOUR = timedelta(hours=1)
SECOND = timedelta(seconds=1)
# A class capturing the platform's idea of local time.
# (May result in wrong values on historical times in
# timezones where UTC offset and/or the DST rules had
# changed in the past.)
import time as _time
STDOFFSET = timedelta(seconds = -_time.timezone)
if _time.daylight:
DSTOFFSET = timedelta(seconds = -_time.altzone)
else:
DSTOFFSET = STDOFFSET
DSTDIFF = DSTOFFSET - STDOFFSET
class LocalTimezone(tzinfo):
def fromutc(self, dt):
assert dt.tzinfo is self
stamp = (dt - datetime(1970, 1, 1, tzinfo=self)) // SECOND
args = _time.localtime(stamp)[:6]
dst_diff = DSTDIFF // SECOND
# Detect fold
fold = (args == _time.localtime(stamp - dst_diff))
return datetime(*args, microsecond=dt.microsecond,
tzinfo=self, fold=fold)
def utcoffset(self, dt):
if self._isdst(dt):
return DSTOFFSET
else:
return STDOFFSET
def dst(self, dt):
if self._isdst(dt):
return DSTDIFF
else:
return ZERO
def tzname(self, dt):
return _time.tzname[self._isdst(dt)]
def _isdst(self, dt):
tt = (dt.year, dt.month, dt.day,
dt.hour, dt.minute, dt.second,
dt.weekday(), 0, 0)
stamp = _time.mktime(tt)
tt = _time.localtime(stamp)
return tt.tm_isdst > 0
Local = LocalTimezone()
# A complete implementation of current DST rules for major US time zones.
def first_sunday_on_or_after(dt):
days_to_go = 6 - dt.weekday()
if days_to_go:
dt += timedelta(days_to_go)
return dt
# US DST Rules
#
# This is a simplified (i.e., wrong for a few cases) set of rules for US
# DST start and end times. For a complete and up-to-date set of DST rules
# and timezone definitions, visit the Olson Database (or try pytz):
# http://www.twinsun.com/tz/tz-link.htm
# http://sourceforge.net/projects/pytz/ (might not be up-to-date)
#
# In the US, since 2007, DST starts at 2am (standard time) on the second
# Sunday in March, which is the first Sunday on or after Mar 8.
DSTSTART_2007 = datetime(1, 3, 8, 2)
# and ends at 2am (DST time) on the first Sunday of Nov.
DSTEND_2007 = datetime(1, 11, 1, 2)
# From 1987 to 2006, DST used to start at 2am (standard time) on the first
# Sunday in April and to end at 2am (DST time) on the last
# Sunday of October, which is the first Sunday on or after Oct 25.
DSTSTART_1987_2006 = datetime(1, 4, 1, 2)
DSTEND_1987_2006 = datetime(1, 10, 25, 2)
# From 1967 to 1986, DST used to start at 2am (standard time) on the last
# Sunday in April (the one on or after April 24) and to end at 2am (DST time)
# on the last Sunday of October, which is the first Sunday
# on or after Oct 25.
DSTSTART_1967_1986 = datetime(1, 4, 24, 2)
DSTEND_1967_1986 = DSTEND_1987_2006
def us_dst_range(year):
# Find start and end times for US DST. For years before 1967, return
# start = end for no DST.
if 2006 < year:
dststart, dstend = DSTSTART_2007, DSTEND_2007
elif 1986 < year < 2007:
dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_2006
elif 1966 < year < 1987:
dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_1986
else:
return (datetime(year, 1, 1), ) * 2
start = first_sunday_on_or_after(dststart.replace(year=year))
end = first_sunday_on_or_after(dstend.replace(year=year))
return start, end
class USTimeZone(tzinfo):
def __init__(self, hours, reprname, stdname, dstname):
self.stdoffset = timedelta(hours=hours)
self.reprname = reprname
self.stdname = stdname
self.dstname = dstname
def __repr__(self):
return self.reprname
def tzname(self, dt):
if self.dst(dt):
return self.dstname
else:
return self.stdname
def utcoffset(self, dt):
return self.stdoffset + self.dst(dt)
def dst(self, dt):
if dt is None or dt.tzinfo is None:
# An exception may be sensible here, in one or both cases.
# It depends on how you want to treat them. The default
# fromutc() implementation (called by the default astimezone()
# implementation) passes a datetime with dt.tzinfo is self.
return ZERO
assert dt.tzinfo is self
start, end = us_dst_range(dt.year)
# Can't compare naive to aware objects, so strip the timezone from
# dt first.
dt = dt.replace(tzinfo=None)
if start + HOUR <= dt < end - HOUR:
# DST is in effect.
return HOUR
if end - HOUR <= dt < end:
# Fold (an ambiguous hour): use dt.fold to disambiguate.
return ZERO if dt.fold else HOUR
if start <= dt < start + HOUR:
# Gap (a non-existent hour): reverse the fold rule.
return HOUR if dt.fold else ZERO
# DST is off.
return ZERO
def fromutc(self, dt):
assert dt.tzinfo is self
start, end = us_dst_range(dt.year)
start = start.replace(tzinfo=self)
end = end.replace(tzinfo=self)
std_time = dt + self.stdoffset
dst_time = std_time + HOUR
if end <= dst_time < end + HOUR:
# Repeated hour
return std_time.replace(fold=1)
if std_time < start or dst_time >= end:
# Standard time
return std_time
if start <= std_time < end - HOUR:
# Daylight saving time
return dst_time
Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")
Central = USTimeZone(-6, "Central", "CST", "CDT")
Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")
Обратите внимание, что в подклассе tzinfo, учитывающем и стандартное, и летнее время, неизбежны тонкости дважды в год на точках перехода DST. Для ясности рассмотрим часовой пояс Восточного времени США (UTC -0500), где EDT начинается через минуту после 1:59 (EST) во второе воскресенье марта и заканчивается через минуту после 1:59 (EDT) в первое воскресенье ноября:
UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM
Когда DST начинается (строка «начало»), местные часы перескакивают с 1:59 до 3:00. Время в формате 2:MM в этот день не имеет реального смысла, поэтому astimezone(Eastern) не вернет результат с hour == 2 в день начала DST. Например, во время весеннего перехода 2016 года мы получаем:
>>> from datetime import datetime, timezone >>> from tzinfo_examples import HOUR, Eastern >>> u0 = datetime(2016, 3, 13, 5, tzinfo=timezone.utc) >>> for i in range(4): ... u = u0 + i*HOUR ... t = u.astimezone(Eastern) ... print(u.time(), 'UTC =', t.time(), t.tzname()) ... 05:00:00 UTC = 00:00:00 EST 06:00:00 UTC = 01:00:00 EST 07:00:00 UTC = 03:00:00 EDT 08:00:00 UTC = 04:00:00 EDT
Когда DST заканчивается (строка «конец»), возникает потенциально более серьезная проблема: существует час, который не может быть однозначно выражен в местном времени: последний час летнего времени. В Восточном часовом поясе это время в формате 5:MM UTC в день окончания летнего времени. Местные часы перескакивают с 1:59 (летнее время) обратно на 1:00 (зимнее время) снова. Местные времена в формате 1:MM неоднозначны. astimezone() имитирует поведение местных часов, отображая два смежных часа UTC в один и тот же местный час при преобразовании. В примере Восточного часового пояса время UTC в формате 5:MM и 6:MM оба отображаются как 1:MM при преобразовании в Восточное время, но для более ранних времен атрибут fold установлен в 0, а для более поздних времен — в 1. Например, во время осеннего перехода 2016 года мы получаем:
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc) >>> for i in range(4): ... u = u0 + i*HOUR ... t = u.astimezone(Eastern) ... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold) ... 04:00:00 UTC = 00:00:00 EDT 0 05:00:00 UTC = 01:00:00 EDT 0 06:00:00 UTC = 01:00:00 EST 1 07:00:00 UTC = 02:00:00 EST 0
Обратите внимание, что экземпляры datetime, отличающиеся только значением атрибута fold, считаются равными при сравнении.
Приложения, которые не могут допускать неоднозначностей во времени, должны явно проверять значение атрибута fold или избегать использования гибридных подклассов tzinfo; неоднозначностей нет при использовании timezone или любого другого подкласса tzinfo с фиксированным смещением (например, класс, представляющий только EST (фиксированное смещение -5 часов) или только EDT (фиксированное смещение -4 часа)).
См. также
-
zoneinfo -
Модуль
datetimeимеет базовый классtimezone(для обработки произвольных фиксированных смещений от UTC) и его атрибутtimezone.utc(экземпляр часового пояса UTC).zoneinfoпредоставляет базу данных часовых поясов IANA (также известную как база данных Olson) в Python, и её использование рекомендуется.
- IANA timezone database
-
База данных часовых поясов (часто называемая tz, tzdata или zoneinfo) содержит код и данные, которые представляют историю местного времени для многих представительных мест во всем мире. Она периодически обновляется, чтобы отразить изменения, внесенные политическими органами в границы часовых поясов, смещения UTC и правила летнего времени.
Объекты timezone
Класс timezone является подклассом tzinfo, каждый экземпляр которого представляет часовой пояс, определённый фиксированным смещением от UTC.
Объекты этого класса не могут использоваться для представления информации о часовом поясе в местах, где используются разные смещения в разные дни года или где были внесены исторические изменения в гражданское время.
-
class datetime.timezone(offset, name=None) -
Аргумент offset должен быть указан как объект
timedelta, представляющий разницу между местным временем и UTC. Он должен находиться строго между-timedelta(hours=24)иtimedelta(hours=24), в противном случае возникаетValueError.Аргумент name является необязательным. Если он указан, он должен быть строкой, которая будет использоваться в качестве значения, возвращаемого методом
datetime.tzname().Введено в версии 3.2.
Изменено в версии 3.7: Смещение от UTC не ограничено целым числом минут.
-
timezone.utcoffset(dt) -
Возвращает фиксированное значение, указанное при создании экземпляра
timezone.Аргумент dt игнорируется. Возвращаемое значение — объект
timedelta, равный разнице между местным временем и UTC.Изменено в версии 3.7: Смещение от UTC не ограничено целым числом минут.
-
timezone.tzname(dt) -
Возвращает фиксированное значение, указанное при создании экземпляра
timezone.Если name не указан в конструкторе, имя, возвращаемое
tzname(dt), генерируется из значенияoffset. Если offset равенtimedelta(0), имя — “UTC”, в противном случае — строка в форматеUTC±HH:MM, где ± — знакoffset, HH и MM — двузначные цифрыoffset.hoursиoffset.minutesсоответственно.Изменено в версии 3.6: Имя, сгенерированное из
offset=timedelta(0), теперь просто‘UTC’, а не'UTC+00:00'.
-
timezone.dst(dt) -
Всегда возвращает
None.
-
timezone.fromutc(dt) -
Возвращает
dt + offset. Аргумент dt должен быть осознанным объектомdatetimeсtzinfoустановленным вself.
Атрибуты класса:
-
timezone.utc -
Часовой пояс UTC,
timezone(timedelta(0)).
strftime() и strptime() поведение
date, datetime и time объекты поддерживают метод strftime(format), чтобы создать строку, представляющую время под управлением явной строки формата.
Обратно, метод класса datetime.strptime() создает объект datetime из строки, представляющей дату и время, и соответствующей строки формата.
В таблице ниже представлено сравнение strftime() и strptime():
|
| |
|---|---|---|
Использование | Преобразовать объект в строку в соответствии с заданным форматом | Разбор строки в объект |
Тип метода | Метод экземпляра | Метод класса |
Метод | ||
Подпись |
|
|
strftime() и strptime() Коды формата
Ниже приведен список всех кодов формата, требуемых стандартом C 1989, и они работают на всех платформах со стандартной реализацией C.
Директива | Значение | Пример | Примечания |
|---|---|---|---|
| День недели как сокращенное название в локали. | (1) | |
| День недели как полное название в локали. | (1) | |
| День недели как десятичное число, где 0 — воскресенье, а 6 — суббота. | 0, 1, …, 6 | |
| День месяца как десятичное число с ведущими нулями. | 01, 02, …, 31 | (9) |
| Месяц как сокращенное название в локали. | (1) | |
| Месяц как полное название в локали. | (1) | |
| Месяц как десятичное число с ведущими нулями. | 01, 02, …, 12 | (9) |
| Год без столетия как десятичное число с ведущими нулями. | 00, 01, …, 99 | (9) |
| Год со столетием как десятичное число. | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (2) |
| Часы (24-часовой формат) как десятичное число с ведущими нулями. | 00, 01, …, 23 | (9) |
| Часы (12-часовой формат) как десятичное число с ведущими нулями. | 01, 02, …, 12 | (9) |
| Локальный эквивалент AM или PM. | (1), (3) | |
| Минуты как десятичное число с ведущими нулями. | 00, 01, …, 59 | (9) |
| Секунды как десятичное число с ведущими нулями. | 00, 01, …, 59 | (4), (9) |
| Микросекунды как десятичное число с ведущими нулями (6 цифр). | 000000, 000001, …, 999999 | (5) |
| Смещение UTC в формате | (пустая), +0000, -0400, +1030, +063415, -030712.345216 | (6) |
| Имя часового пояса (пустая строка, если объект неявный). | (пустая), UTC, GMT | (6) |
| День года как десятичное число с ведущими нулями. | 001, 002, …, 366 | (9) |
| Номер недели года (воскресенье — первый день недели) как десятичное число с ведущими нулями. Все дни в новом году, предшествующие первому воскресенью, считаются неделей 0. | 00, 01, …, 53 | (7), (9) |
| Номер недели года (понедельник — первый день недели) как десятичное число с ведущими нулями. Все дни в новом году, предшествующие первому понедельнику, считаются неделей 0. | 00, 01, …, 53 | (7), (9) |
| Соответствующее локали представление даты и времени. | (1) | |
| Соответствующее локали представление даты. | (1) | |
| Соответствующее локали представление времени. | (1) | |
| Буквальный символ | % |
Несколько дополнительных директив, не требуемых стандартом C89, включены для удобства. Эти параметры соответствуют значениям даты ISO 8601.
Директива | Значение | Пример | Примечания |
|---|---|---|---|
| Год ISO 8601 со столетием, представляющий год, содержащий большую часть недели ISO ( | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (8) |
| День недели ISO 8601 как десятичное число, где 1 — понедельник. | 1, 2, …, 7 | |
| Неделя ISO 8601 как десятичное число с понедельником как первым днем недели. Неделя 01 — неделя, содержащая 4 января. | 01, 02, …, 53 | (8), (9) |
Они могут быть недоступны на всех платформах при использовании с методом strftime(). Директивы года ISO 8601 и недели ISO 8601 не взаимозаменяемы с вышеуказанными директивами года и номера недели. Вызов strptime() с неполными или неоднозначными директивами ISO 8601 приведет к ошибке ValueError.
Полный набор поддерживаемых кодов формата варьируется в зависимости от платформы, потому что Python вызывает функцию strftime() платформенной библиотеки C, и платформенные различия распространены. Чтобы увидеть полный набор кодов формата, поддерживаемых на вашей платформе, обратитесь к документации strftime(3). Также существуют различия между платформами в обработке неподдерживаемых спецификаторов формата.
Новое в версии 3.6: %G, %u и %V были добавлены.
Технические детали
В общем случае, d.strftime(fmt) ведет себя как модуль time, хотя не все объекты поддерживают метод timetuple().
Для метода класса datetime.strptime() значение по умолчанию равно 1900-01-01T00:00:00.000: любые компоненты, не указанные в строке формата, будут взяты из значения по умолчанию. 4
Использование datetime.strptime(date_string, format) эквивалентно:
datetime(*(time.strptime(date_string, format)[0:6]))
за исключением случаев, когда формат включает компоненты с дробной частью секунды или информацию о смещении часового пояса, которые поддерживаются в datetime.strptime, но отбрасываются time.strptime.
Для объектов time, коды формата для года, месяца и дня не следует использовать, так как объекты time не имеют таких значений. Если они используются, 1900 подставляется для года, а 1 для месяца и дня.
Для объектов date, коды формата для часов, минут, секунд и микросекунд не следует использовать, так как объекты date не имеют таких значений. Если они используются, 0 подставляется для них.
По той же причине обработка строк формата, содержащих символы Unicode, которые не могут быть представлены в кодировке текущего региона, также зависит от платформы. На некоторых платформах такие символы сохраняются без изменений в выводе, а на других strftime может вызвать UnicodeError или вернуть пустую строку вместо этого.
Примечания:
- Поскольку формат зависит от текущего региона, необходимо проявлять осторожность при формулировании предположений о значении вывода. Порядок полей будет различаться (например, «месяц/день/год» по сравнению с «день/месяц/год»), а вывод может содержать символы Unicode, закодированные с использованием кодировки по умолчанию региона (например, если текущий регион
ja_JP, кодировка по умолчанию может быть любой изeucJP,SJIS, илиutf-8; используйтеlocale.getlocale(), чтобы определить кодировку текущего региона). -
Метод
strptime()может анализировать годы в полном диапазоне [1, 9999], но годы < 1000 должны быть заполнены нулями до 4-значной ширины.Изменено в версии 3.2: В предыдущих версиях метод
strftime()был ограничен годами >= 1900.Изменено в версии 3.3: В версии 3.2 метод
strftime()был ограничен годами >= 1000. - При использовании с методом
strptime(), директива%pвлияет на выходное поле часов только если директива%Iиспользуется для анализа часов. - В отличие от модуля
time, модульdatetimeне поддерживает високосных секунд. - При использовании с методом
strptime()директива%fпринимает от одного до шести цифр и дополняет справа нулями.%fявляется расширением набора символов формата в стандарте C (но реализуется отдельно для объектов datetime и поэтому всегда доступен). -
Для объекта без часового пояса коды формата
%zи%Zзаменяются пустыми строками.Для объекта с часовым поясом:
-
%z -
utcoffset()преобразуется в строку вида±HHMM[SS[.ffffff]], гдеHH— строка из двух цифр, указывающая количество часов смещения по UTC,MM— строка из двух цифр, указывающая количество минут смещения по UTC,SS— строка из двух цифр, указывающая количество секунд смещения по UTC, аffffff— строка из шести цифр, указывающая количество микросекунд смещения по UTC. Частьffffffопускается, когда смещение — целое число секунд, и частиffffffиSSопускаются, когда смещение — целое число минут. Например, еслиutcoffset()возвращаетtimedelta(hours=-3, minutes=-30),%zзаменяется строкой'-0330'.
Изменено в версии 3.7: Смещение по UTC не ограничено целым числом минут.
Изменено в версии 3.7: Когда директива
%zпредоставляется методуstrptime(), смещения по UTC могут иметь двоеточие в качестве разделителя между часами, минутами и секундами. Например,'+01:00:00'будет интерпретироваться как смещение в один час. Кроме того, предоставление'Z'идентично'+00:00'.-
%Z -
В
strftime(),%Zзаменяется пустой строкой, еслиtzname()возвращаетNone; в противном случае%Zзаменяется возвращаемым значением, которое должно быть строкой.strptime()принимает только определенные значения для%Z:- любое значение в
time.tznameдля региона вашей машины - запрограммированные значения
UTCиGMT
Например, у человека, живущего в Японии,
JST,UTC, иGMTмогут быть допустимыми значениями, но, вероятно, неEST. Для недопустимых значений будет вызвано исключениеValueError. - любое значение в
-
- При использовании с методом
strptime(),%Uи%Wиспользуются только в расчётах, когда указан день недели и календарный год (%Y). - Аналогично
%Uи%W,%Vиспользуется только в расчётах, когда в строке форматаstrptime()указан день недели и год ISO (%G). Также обратите внимание, что%Gи%Yне взаимозаменяемы. - При использовании с методом
strptime()ведущий ноль необязателен для форматов%d,%m,%H,%I,%M,%S,%J,%U,%W, и%V. Для формата%yведущий ноль необходим.
Примечания
-
1 -
Если, конечно, мы игнорируем эффекты относительности
-
2 -
Это соответствует определению «пролептического григорианского» календаря в книге Дершовица и Рейнгольда «Расчеты календаря», где это базовый календарь для всех вычислений. Обратитесь к книге для алгоритмов преобразования между пролептическими григорианскими порядковыми номерами и многими другими календарными системами.
-
3 -
См. руководство Р. Х. ван Гента по математике календаря ISO 8601 для лучшего объяснения.
-
4 -
Передача
datetime.strptime('Feb 29', '%b %d')приведет к ошибке, так как1900— не високосный год.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/datetime.html