datetime — Основные типы даты и времени¶
Исходный код: Lib/datetime.py.
Модуль datetime предоставляет классы для работы с датами и временем.
Хотя арифметика даты и времени поддерживается, основное внимание в реализации уделяется эффективному извлечению атрибутов для форматирования и манипулирования выводом.
См.также
Осознанные и наивные объекты¶
Объекты даты и времени могут быть классифицированы как «осведомленные» или «наивные» в зависимости от того, включают ли они информацию о часовом поясе или нет.
При достаточном знании применимых алгоритмических и политических корректировок времени, таких как информация о часовом поясе и переходе на летнее время, осознающий объект может определить свое местоположение относительно других осознающих объектов. Осознающий объект представляет собой конкретный момент времени, который не подлежит интерпретации. 1
Объект naive не содержит достаточно информации, чтобы однозначно определить свое местоположение относительно других объектов даты/времени. Представляет ли наивный объект всемирное координированное время (UTC), местное время или время в каком-либо другом часовом поясе, зависит исключительно от программы, точно так же, как от программы зависит, представляет ли конкретное число метры, мили или массу. Наивные объекты просты для понимания и работы с ними, ценой игнорирования некоторых аспектов реальности.
Для приложений, требующих осведомленных объектов, объекты datetime и time имеют необязательный атрибут информации о часовом поясе, tzinfo, который может быть установлен на экземпляр подкласса абстрактного класса tzinfo. Эти объекты tzinfo собирают информацию о смещении от времени UTC, названии часового пояса и о том, действует ли переход на летнее время.
Только один конкретный класс tzinfo, класс timezone, поставляется модулем datetime. Класс 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не являетсяNoned.tzinfo.utcoffset(d)не возвращаетNone
В противном случае d является наивным.
Объект time t является осведомленным, если выполняются оба следующих условия:
t.tzinfoне являетсяNonet.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. Аргументы могут быть целыми или плавающими числами и могут быть положительными или отрицательными.Внутри хранятся только дни, секунды и микросекунды. Аргументы преобразуются в эти единицы:
Миллисекунда преобразуется в 1000 микросекунд.
Минута преобразуется в 60 секунд.
Час преобразуется в 3600 секунд.
Неделя преобразуется в 7 дней.
а дни, секунды и микросекунды затем нормализуются так, чтобы представление было уникальным, при этом
0 <= microseconds < 10000000 <= 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)
Если какой-либо аргумент является float и в нем присутствуют дробные микросекунды, то дробные микросекунды, оставшиеся от всех аргументов, объединяются, и их сумма округляется до ближайшей микросекунды с использованием тайбрейка «половина к чету». Если ни один из аргументов не является плавающей величиной, процессы преобразования и нормализации являются точными (информация не теряется).
Если нормализованное значение дней лежит вне указанного диапазона, то повышается значение
OverflowError.Обратите внимание, что нормализация отрицательных значений может поначалу удивить. Например:
>>> from datetime import timedelta >>> d = timedelta(microseconds=-1) >>> (d.days, d.seconds, d.microseconds) (-1, 86399, 999999)
Атрибуты класса:
-
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 с помощью функции round-half-to-even. |
|
Деление (3) общей продолжительности t2 на единицу интервала t3. Возвращает объект |
|
Дельта, деленная на float или int. Результат округляется до ближайшего кратного timedelta.resolution с помощью функции round-half-to-even. |
|
Вычисляется пол, а остаток (если он есть) отбрасывается. Во втором случае возвращается целое число. (3) |
|
Остаток вычисляется как объект |
|
Вычисляет коэффициент и остаток: |
|
Возвращает объект |
|
эквивалентно |
|
эквивалентно +t, когда |
|
Возвращает строку в форме |
|
Возвращает строковое представление объекта |
Примечания:
Это точное значение, но возможно переполнение.
Это точный показатель, который не может переполниться.
Деление на 0 приводит к появлению
ZeroDivisionError.-timedelta.max не может быть представлен как объект
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, если временная метка находится вне диапазона значений, поддерживаемых функцией платформы Clocaltime(), иOSErrorпри неудачеlocaltime(). Обычно это ограничено годами с 1970 по 2038. Обратите внимание, что в не-POSIX системах, которые включают високосные секунды в свое понятие временной метки, високосные секунды игнорируются функциейfromtimestamp().Изменено в версии 3.3: Поднимайте
OverflowErrorвместоValueError, если временная метка находится вне диапазона значений, поддерживаемых функцией платформы Clocaltime(). Вызывать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, соответствующий дате_строки, заданной в формате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¶ Наименьшая возможная разница между неравными объектами даты,
timedelta(days=1).
Атрибуты экземпляра (только для чтения):
-
date.month¶ От 1 до 12 включительно.
-
date.day¶ От 1 до количества дней в данном месяце данного года.
Поддерживаемые операции:
Операция |
Результат |
|---|---|
|
дата2 наступит через |
|
Вычисляет дату2 такую, что |
|
(3) |
|
дата1 считается меньше, чем дата2, если дата1 предшествует дате2 по времени. (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, и дата2 + timedelta == дата1 после.
Другими словами,
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. Для любого
dateобъекта d,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()¶ Возвращает объект named tuple с тремя компонентами:
year,weekиweekday.Календарь ISO - это широко используемый вариант григорианского календаря. 3
Год ISO состоит из 52 или 53 полных недель, а неделя начинается в понедельник и заканчивается в воскресенье. Первая неделя года ISO - это первая (григорианская) календарная неделя года, содержащая четверг. Она называется неделей номер 1, и год ИСО этого четверга совпадает с его григорианским годом.
Например, 2004 год начинается в четверг, поэтому первая неделя 2004 года ISO начинается в понедельник, 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: Результат изменился с кортежа на named tuple.
-
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в formatted string literals и при использовании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как местное время, предпочтительнее использовать aware datetimes для представления времени в 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как местное время, предпочтительнее использовать aware datetimes для представления времени в 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.Для любого
datetimeобъекта d,d == datetime.combine(d.date(), d.time(), d.tzinfo). Если дата является объектомdatetime, ее компоненты времени и атрибутыtzinfoигнорируются.Изменено в версии 3.6: Добавлен аргумент tzinfo.
-
classmethod
datetime.fromisoformat(date_string)¶ Возвращает
datetime, соответствующий дате_строки в одном из форматов, выдаваемых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, не относящиеся к дате, заполняются своими обычными значениями по умолчанию. Это обратная функцияdatetime.isocalendar().Добавлено в версии 3.8.
-
classmethod
datetime.strptime(date_string, format)¶ Возвращает
datetime, соответствующий дата_строки, разобранной в соответствии с форматом.Это эквивалентно:
datetime(*(time.strptime(date_string, format)[0:6]))
Если строка даты_ и формат не могут быть разобраны командой
ValueErrorили если возвращается значение, не являющееся кортежем времени, то возникает ошибкаtime.strptime(). Полный список директив форматирования приведен в разделе strftime() и strptime() Поведение.
Атрибуты класса:
-
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 - это длительность временной дельты, удаленной от datetime1, двигаясь вперед во времени, если
timedelta.days> 0, или назад, еслиtimedelta.days< 0. Результат имеет тот же атрибутtzinfo, что и входной datetime, и datetime2 - datetime1 == временная дельта после. Если datetime2.year будет меньшеOverflowErrorили большеMINYEAR, то возникает ошибкаMAXYEAR. Обратите внимание, что корректировка часового пояса не выполняется, даже если входной информацией является объект aware.Вычисляет 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.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может быть указано для создания наивного времени даты из известного времени даты без преобразования данных даты и времени.Добавлено в версии 3.6: Добавлен аргумент
fold.
-
datetime.astimezone(tz=None)¶ Возвращает объект
datetimeс новымtzinfoатрибутом tz, корректируя данные даты и времени таким образом, чтобы в результате получалось то же время 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). Если вы просто хотите удалить объект часового пояса из известного времени 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()¶ Если
datetimeэкземпляр d наивен, это то же самое, что иd.timetuple(), за исключением того, чтоtm_isdstпринудительно принимает значение 0 независимо от того, что возвращаетd.dst(). DST никогда не действует для времени UTC.Если d известно, то d нормализуется до времени UTC путем вычитания
d.utcoffset(), и возвращаетсяtime.struct_timeдля нормализованного времени.tm_isdstпринудительно равен 0. Обратите внимание, что может возникнуть ошибкаOverflowError, если d.year былMINYEARилиMAXYEAR, и корректировка UTC выходит за границу года.Предупреждение
Поскольку наивные объекты
datetimeрассматриваются многими методамиdatetimeкак местное время, предпочтительнее использовать aware datetimes для представления времени в 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()¶ Возвращает named tuple с тремя компонентами:
year,weekиweekday. То же самое, что иself.date().isocalendar().
-
datetime.isoformat(sep='T', timespec='auto')¶ Возвращает строку, представляющую дату и время в формате ISO 8601:
YYYY-MM-DDTHH:MM:SS.ffffff, еслиmicrosecondне 0YYYY-MM-DDTHH:MM:SS, еслиmicrosecondравен 0
Если
utcoffset()не возвращаетNone, добавляется строка, указывающая смещение UTC:YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], еслиmicrosecondне 0YYYY-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.'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.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в formatted string literals и при использовании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, фиксирующий информацию о часовом поясе для Кабула, Афганистан, который использовал +4 UTC до 1945 года, а затем +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 Объекты¶
Объект 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.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не 0HH:MM:SS, еслиmicrosecondравен 0HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], еслиutcoffset()не возвращаетсяNoneHH:MM:SS+HH:MM[:SS[.ffffff]], еслиmicrosecondравно 0 иutcoffset()не возвращаетNone
Необязательный аргумент timespec задает количество дополнительных компонентов времени, которые необходимо включить (по умолчанию
'auto'). Он может быть одним из следующих:'auto': То же, что и'seconds', еслиmicrosecondравно 0, то же, что и'microseconds'в противном случае.'hours': Включитеhourв двузначный форматHH.'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в formatted string literals и при использовании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своего атрибута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:ММ не имеет смысла в этот день, поэтому 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 заканчивается (линия «end»), возникает потенциально более серьезная проблема: есть час, который не может быть однозначно написан в местном стенном времени: последний час светлого времени суток. В восточном варианте это время вида 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.
Директива |
Значение |
Пример |
Примечания |
|---|---|---|---|
|
Будний день как сокращенное название локали. |
Sun, Mon, …, Sat
(en_US);
So, Mo, …, Sa
(de_DE)
|
(1) |
|
Будний день как полное имя локали. |
Воскресенье, понедельник, …, суббота (en_US);
Воскресенье, понедельник, …, суббота (en_DE)
|
(1) |
|
День недели в виде десятичного числа, где 0 - воскресенье, а 6 - суббота. |
0, 1, …, 6 |
|
|
День месяца в виде десятичного числа с нулевой добавкой. |
01, 02, …, 31 |
(9) |
|
Месяц как сокращенное название локали. |
Январь, февраль, …, декабрь (en_US);
Jan, Feb, …, Dez
(de_DE)
|
(1) |
|
Месяц как полное имя локали. |
Январь, февраль, …, декабрь (en_US);
Январь, февраль, …, декабрь (en_DE)
|
(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. |
AM, PM (en_US);
утра, вечера (de_DE)
|
(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) |
|
Соответствующее представление даты и времени в локали. |
Tue Aug 16 21:30:00
1988 (en_US);
Sun 16 Aug 21:30:00 1988 (de_DE)
|
(1) |
|
Соответствующее представление даты в локали. |
08/16/88 (нет);
08/16/1988 (en_US);
16.08.1988 (de_DE)
|
(1) |
|
Соответствующее представление времени в локали. |
21:30:00 (en_US);
21:30:00 (de_DE)
|
(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 year и ISO 8601 week не являются взаимозаменяемыми с директивами year и week number, приведенными выше. Вызов strptime() с неполными или неоднозначными директивами ISO 8601 вызовет ошибку ValueError.
Полный набор поддерживаемых форматных кодов различается на разных платформах, поскольку Python вызывает функцию strftime() библиотеки Platform C, и различия между платформами являются обычным явлением. Чтобы узнать полный набор форматных кодов, поддерживаемых на вашей платформе, обратитесь к документации strftime(3). Существуют также различия между платформами в обработке неподдерживаемых спецификаторов формата.
Добавлено в версии 3.6: Были добавлены %G, %u и %V.
Технические детали¶
В широком смысле d.strftime(fmt) действует подобно time модуля time.strftime(fmt, d.timetuple()), хотя не все объекты поддерживают метод 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, которые не могут быть представлены в charset текущей локали, также зависит от платформы. На некоторых платформах такие кодовые точки сохраняются в выводе, в то время как на других 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заменяются пустыми строками.Для осознанного объекта:
%zutcoffset()преобразуется в строку вида±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используется в вычислениях только тогда, когда день недели и год ISO (%G) указаны в строке форматаstrptime(). Также обратите внимание, что%Gи%Yне являются взаимозаменяемыми.При использовании метода
strptime()ведущий нуль необязателен для форматов%d,%m,%H,%I,%M,%S,%J,%U,%Wи%V. Формат%yтребует ведущего нуля.
Сноски
- 1
Если, то есть, мы игнорируем эффекты относительности
- 2
Это соответствует определению «пролептического григорианского» календаря в книге Дершовица и Рейнгольда Календарные вычисления, где он является базовым календарем для всех вычислений. Алгоритмы преобразования между пролептическими григорианскими ординалами и многими другими календарными системами см. в книге.
- 3
Хорошее объяснение см. в книге Р. Х. ван Гента guide to the mathematics of the ISO 8601 calendar.
- 4
Передача
datetime.strptime('Feb 29', '%b %d')завершится неудачей, поскольку1900не является високосным годом.