Содержание страницы
datetime – Основные типы даты и времени¶datetime – Basic date and time types
Исходный код: Lib/datetime.py
Модуль datetime предоставляет классы для работы с датами и временем.
Хотя арифметика дат и времени поддерживается, основное внимание в реализации уделяется эффективному извлечению атрибутов для форматирования и обработки вывода.
Совет
Перейти к кодам форматирования.
См. также
- Модуль
calendar Общие функции, связанные с календарём.
- Модуль
time Доступ к времени и преобразования.
- Модуль
zoneinfo Конкретные часовые пояса, представляющие базу данных часовых поясов IANA.
- Пакет dateutil
Сторонняя библиотека с расширенной поддержкой часовых поясов и разбора.
- Пакет DateType
Сторонняя библиотека, которая вводит отдельные статические типы, чтобы, например, позволить статическим проверкам типов различать наивные и осведомлённые объекты datetime.
Осведомлённые и наивные объекты¶Aware and naive objects
Объекты даты и времени могут быть отнесены к категории «осведомлённых» или «наивных» в зависимости от того, содержат ли они информацию о часовом поясе.
При достаточном знании применимых алгоритмических и политических поправок времени, таких как информация о часовом поясе и переходе на летнее время, осведомлённый объект может определить своё положение относительно других осведомлённых объектов. Осведомлённый объект представляет конкретный момент времени, не допускающий неоднозначного толкования. [1]
Наивный объект не содержит достаточно информации, чтобы однозначно определить своё положение относительно других объектов даты/времени. Представляет ли наивный объект Всемирное координированное время (UTC), местное время или время в другом часовом поясе – это полностью зависит от программы, так же как от программы зависит, представляет ли конкретное число метры, мили или массу. Наивные объекты легко понять и использовать, ценой игнорирования некоторых аспектов реальности.
Для приложений, требующих осведомлённых объектов, объекты datetime и time
имеют необязательный атрибут информации о часовом поясе tzinfo, который
может быть установлен в экземпляр подкласса абстрактного класса tzinfo.
Эти объекты tzinfo содержат информацию о смещении от UTC,
названии часового пояса и о том, действует ли летнее время.
Только один конкретный класс tzinfo, класс timezone, предоставляется модулем datetime.
Класс timezone может представлять простые часовые пояса с фиксированным смещением от UTC, такие как сам UTC или
часовые пояса североамериканских EST и EDT. Поддержка часовых поясов с более глубоким уровнем детализации
оставляется на усмотрение приложения. Правила корректировки времени в мире
более политизированы, чем рациональны, часто меняются, и не существует
стандарта, подходящего для всех приложений, кроме UTC.
Константы¶Constants
Модуль datetime экспортирует следующие константы:
- datetime.MAXYEAR¶
Наибольший номер года, допустимый в объекте
dateилиdatetime.MAXYEARравен 9999.
- datetime.UTC¶
Псевдоним для синглтона часового пояса UTC
datetime.timezone.utc.Добавлено в версии 3.12.
Доступные типы¶Available types
- 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
Длительность, представляющая разницу между двумя экземплярами
datetimeилиdateс точностью до микросекунды.
- class datetime.tzinfo
Абстрактный базовый класс для объектов информации о часовых поясах. Они используются классами
datetimeиtimeдля предоставления настраиваемого понятия коррекции времени (например, для учёта часового пояса и/или летнего времени).
- class datetime.timezone
Класс, реализующий абстрактный базовый класс
tzinfoв виде фиксированного смещения от UTC.Добавлено в версии 3.2.
Объекты этих типов неизменяемы.
Отношения подклассов:
Общие свойства¶Common properties
Типы date, datetime, time и timezone
имеют следующие общие особенности:
Объекты этих типов неизменяемы.
Объекты этих типов являются хешируемыми, то есть могут использоваться в качестве ключей словаря.
Объекты этих типов поддерживают эффективную сериализацию с помощью модуля
pickle.
Определение, является ли объект aware или naive¶Determining if an object is aware or naive
Объекты типа date всегда naive.
Объект типа time или datetime может быть aware или naive.
Объект datetime d является aware, если выполняются оба следующих условия:
d.tzinfoне являетсяNoned.tzinfo.utcoffset(d)не возвращаетNone
В противном случае d является naive.
Объект time t является aware, если выполняются оба следующих условия:
t.tzinfoне являетсяNonet.tzinfo.utcoffset(None)не возвращаетNone.
В противном случае t является naive.
Различие между aware и naive не применимо к объектам timedelta
.
timedelta объекты¶timedelta objects
Объект timedelta представляет длительность, разницу между двумя
экземплярами datetime или date.
- 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 < 10000000 <= seconds < 3600*24(количество секунд в одном дне)-999999999 <= days <= 999999999
Следующий пример показывает, как любые аргументы, кроме days, seconds и microseconds, «объединяются» и нормализуются в эти три результирующих атрибута:
>>> import datetime as dt >>> delta = dt.timedelta( ... days=50, ... seconds=27, ... microseconds=10, ... milliseconds=29000, ... minutes=5, ... hours=8, ... weeks=2 ... ) >>> # Остаются только дни, секунды и микросекунды >>> delta datetime.timedelta(days=64, seconds=29156, microseconds=10)
Совет
import datetime as dtвместоimport datetimeилиfrom datetime import datetime, чтобы избежать путаницы между модулем и классом. См. Как я импортирую модуль datetime в Python.Если какой-либо аргумент является числом с плавающей запятой и есть дробные микросекунды, то дробные микросекунды, оставшиеся от всех аргументов, объединяются, и их сумма округляется до ближайшей микросекунды с использованием правила округления до ближайшего чётного. Если ни один аргумент не является числом с плавающей запятой, процессы преобразования и нормализации являются точными (информация не теряется).
Если нормализованное значение дней выходит за указанный диапазон, возбуждается
OverflowError.Обратите внимание, что нормализация отрицательных значений может сначала показаться неожиданной. Например:
>>> import datetime as dt >>> d = dt.timedelta(microseconds=-1) >>> (d.days, d.seconds, d.microseconds) (-1, 86399, 999999)
Поскольку строковое представление объектов
timedeltaможет сбивать с толку, используйте следующий рецепт, чтобы получить более читаемый формат:>>> def pretty_timedelta(td): ... if td.days >= 0: ... return str(td) ... return f'-({-td!s})' ... >>> d = timedelta(hours=-1) >>> str(d) # неудобно для человека '-1 day, 23:00:00' >>> pretty_timedelta(d) '-(1:00:00)'
Атрибуты класса:
- 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.
Атрибуты экземпляра (только для чтения):
- timedelta.days¶
От -999,999,999 до 999,999,999 включительно.
- timedelta.seconds¶
От 0 до 86,399 включительно.
Внимание
Это довольно распространённая ошибка, когда код непреднамеренно использует этот атрибут, хотя на самом деле предполагается получить значение
total_seconds()вместо этого:>>> import datetime as dt >>> duration = dt.timedelta(seconds=11235813) >>> duration.days, duration.seconds (130, 3813) >>> duration.total_seconds() 11235813.0
- timedelta.microseconds¶
От 0 до 999,999 включительно.
Поддерживаемые операции:
Операция |
Результат |
|---|---|
|
Сумма |
|
Разность |
|
Дельта, умноженная на целое число.
После этого |
В общем случае |
|
|
Дельта, умноженная на число с плавающей запятой. Результат округляется до ближайшего кратного timedelta.resolution по правилу round-half-to-even. |
|
Деление (3) общей длительности |
|
Дельта, делённая на число с плавающей запятой или целое число. Результат округляется до ближайшего кратного timedelta.resolution по правилу round-half-to-even. |
|
Вычисляется целая часть, а остаток (если он есть) отбрасывается. Во втором случае возвращается целое число. (3) |
|
Остаток вычисляется как объект
|
|
Вычисляет частное и остаток:
|
|
Возвращает объект |
|
Эквивалентно |
|
Эквивалентно |
|
Возвращает строку вида
|
|
Возвращает строковое представление объекта
|
Примечания:
Это точное, но может привести к переполнению.
Это точное и не может привести к переполнению.
Деление на ноль вызывает
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 поддерживают сравнение на равенство и упорядочивание.
В логических контекстах объект timedelta считается
истинным тогда и только тогда, когда он не равен timedelta(0).
Методы экземпляра:
- timedelta.total_seconds()¶
Возвращает общее количество секунд, содержащихся в длительности. Эквивалентно
td / timedelta(seconds=1). Для единиц интервала, отличных от секунд, используйте форму деления напрямую (например,td / timedelta(microseconds=1)).Обратите внимание, что для очень больших временных интервалов (более 270 лет на большинстве платформ) этот метод теряет точность до микросекунд.
Добавлено в версии 3.2.
Примеры использования: timedelta¶Examples of usage: timedelta
Дополнительный пример нормализации:
>>> # Компоненты another_year в сумме составляют ровно 365 дней
>>> import datetime as dt
>>> year = dt.timedelta(days=365)
>>> another_year = dt.timedelta(weeks=40, days=84, hours=23,
... minutes=50, seconds=600)
>>> year == another_year
True
>>> year.total_seconds()
31536000.0
Примеры арифметики timedelta:
>>> import datetime as dt
>>> year = dt.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 objects
Объект 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 timestamp, такую, как возвращает
time.time().Это может вызвать
OverflowError, если метка времени находится за пределами диапазона значений, поддерживаемого функцией Clocaltime()платформы, иOSErrorпри ошибкеlocaltime(). Обычно это ограничивается годами с 1970 по 2038. Обратите внимание, что в системах, не соответствующих POSIX, которые включают високосные секунды в своё представление метки времени, високосные секунды игнорируются функциейfromtimestamp().Изменено в версии 3.3: Вызывает
OverflowErrorвместоValueError, если метка времени выходит за пределы диапазона значений, поддерживаемого функциейlocaltime()платформы C. ВызываетOSErrorвместоValueErrorпри ошибкеlocaltime().Изменено в версии 3.15: Принимает любое действительное число в качестве timestamp, а не только целое или число с плавающей запятой.
- classmethod date.fromordinal(ordinal)¶
Возвращает дату, соответствующую пролептическому григорианскому ordinal, где 1 января 1 года имеет порядковый номер 1.
ValueErrorвызывается, если только1 <= ordinal <= date.max.toordinal(). Для любой датыd,date.fromordinal(d.toordinal()) == d.
- classmethod date.fromisoformat(date_string)¶
Возвращает
date, соответствующий date_string, заданной в любом допустимом формате ISO 8601, за следующими исключениями:Даты с пониженной точностью в настоящее время не поддерживаются (
YYYY-MM,YYYY).Расширенные представления дат в настоящее время не поддерживаются (
±YYYYYY-MM-DD).Порядковые даты в настоящее время не поддерживаются (
YYYY-OOO).
Примеры:
>>> import datetime as dt >>> dt.date.fromisoformat('2019-12-04') datetime.date(2019, 12, 4) >>> dt.date.fromisoformat('20191204') datetime.date(2019, 12, 4) >>> dt.date.fromisoformat('2021-W01-1') datetime.date(2021, 1, 4)
Добавлено в версии 3.7.
Изменено в версии 3.11: Ранее этот метод поддерживал только формат
YYYY-MM-DD.
- classmethod date.fromisocalendar(year, week, day)¶
Возвращает
date, соответствующий дате календаря ISO, указанной с помощью year, week и day. Это обратная функция дляdate.isocalendar().Добавлено в версии 3.8.
- classmethod date.strptime(date_string, format)¶
Возвращает
date, соответствующий date_string, разобранной в соответствии с format. Это эквивалентно:date(*(time.strptime(date_string, format)[0:3]))
ValueErrorвызывается, если date_string и format не могут быть разобраны с помощьюtime.strptime(), или если возвращается значение, не являющееся временным кортежем. См. также поведение strftime() и strptime() иdate.fromisoformat().Примечание
Если format указывает день месяца (
%d) без года,ValueErrorвозникает. Это позволяет избежать ошибки, связанной с високосным годом, которая происходит раз в четыре года в коде, пытающемся разобрать только месяц и день, поскольку год по умолчанию, используемый при отсутствии года в формате, не является високосным. Обходной путь – всегда включать год в ваш format. При разборе значений date_string, не содержащих года, явно добавьте високосный год перед разбором:>>> import datetime as dt >>> date_string = "02/29" >>> when = dt.date.strptime(f"{date_string};1984", "%m/%d;%Y") # Избегает ошибки високосного года. >>> when.strftime("%B %d") 'February 29'
Добавлено в версии 3.14.
Атрибуты класса:
- date.min¶
Самая ранняя представимая дата,
date(MINYEAR, 1, 1).
- date.max¶
Самая поздняя представимая дата,
date(MAXYEAR, 12, 31).
- date.resolution¶
Наименьшая возможная разница между неравными объектами дат,
timedelta(days=1).
Атрибуты экземпляра (только для чтения):
- date.month¶
От 1 до 12 включительно.
- date.day¶
От 1 до количества дней в указанном месяце указанного года.
Поддерживаемые операции:
Операция |
Результат |
|---|---|
|
|
|
Вычисляет |
|
(3) |
date1 == date2date1 != date2 |
Сравнение на равенство. (4) |
date1 < date2date1 > date2date1 <= date2date1 >= date2 |
Сравнение порядка. (5) |
Примечания:
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после.Объекты
dateравны, если они представляют одну и ту же дату.Объекты
date, не являющиеся также экземплярамиdatetime, никогда не равны объектамdatetime, даже если они представляют одну и ту же дату.date1 считается меньше date2, когда date1 предшествует date2 во времени. Другими словами,
date1 < date2тогда и только тогда, когдаdate1.toordinal() < date2.toordinal().Сравнение порядка между объектом
date, не являющимся также экземпляромdatetime, и объектомdatetimeвозбуждаетTypeError.
Изменено в версии 3.13: Сравнение между объектом datetime и экземпляром подкласса date, который не является подклассом datetime, больше не преобразует последний в date, игнорируя временную часть и часовой пояс.
Поведение по умолчанию можно изменить, переопределив специальные методы сравнения в подклассах.
В булевом контексте все объекты date считаются истинными.
Методы экземпляра:
- date.replace(year=self.year, month=self.month, day=self.day)¶
Возвращает новый объект
dateс теми же значениями, но с обновлёнными указанными параметрами.Пример:
>>> import datetime as dt >>> d = dt.date(2002, 12, 31) >>> d.replace(day=26) datetime.date(2002, 12, 26)
Универсальная функция
copy.replace()также поддерживает объектыdate.
- 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 г.:
>>> import datetime as dt >>> dt.date(2003, 12, 29).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=1) >>> dt.date(2004, 1, 4).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
Изменено в версии 3.9: Результат изменён с кортежа на именованный кортеж.
- date.isoformat()¶
Возвращает строку, представляющую дату в формате ISO 8601,
YYYY-MM-DD:>>> import datetime as dt >>> dt.date(2002, 12, 4).isoformat() '2002-12-04'
- date.__str__()¶
Для даты
dstr(d)эквивалентноd.isoformat().
- date.ctime()¶
Возвращает строку, представляющую дату:
>>> import datetime as dt >>> dt.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)¶
Возвращает строку, представляющую дату, управляемую явной строкой формата. Коды формата, относящиеся к часам, минутам или секундам, будут иметь нулевые значения. См. также поведение strftime() и strptime() и
date.isoformat().
- date.__format__(format)¶
То же, что
date.strftime(). Это позволяет задавать строку форматирования для объектаdateв форматированных строковых литералах и при использованииstr.format(). См. также Поведение strftime() и strptime() иdate.isoformat().
Примеры использования: date¶Examples of usage: date
Пример подсчёта дней до события:
>>> import time
>>> import datetime as dt
>>> today = dt.date.today()
>>> today
datetime.date(2007, 12, 5)
>>> today == dt.date.fromtimestamp(time.time())
True
>>> my_birthday = dt.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:
>>> import datetime as dt
>>> d = dt.date.fromordinal(730920) # 730920-й день после 1.1.0001
>>> d
datetime.date(2002, 3, 11)
>>> # Методы, связанные с форматированием строкового вывода
>>> 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.'
>>> # Методы для извлечения «компонентов» в разных календарях
>>> 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 )
>>> # Объект date является неизменяемым; все операции создают новый объект
>>> d.replace(year=2005)
datetime.date(2005, 3, 11)
datetime объекты¶datetime objects
Объект 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)¶
Аргументы year, month и day обязательны. 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.Эта функция предпочтительнее
today()иutcnow().Примечание
Последующие вызовы
datetime.now()могут возвращать один и тот же момент времени в зависимости от точности базовых часов.
- classmethod datetime.utcnow()¶
Возвращает текущие дату и время UTC, с
tzinfoNone.Это похоже на
now(), но возвращает текущие дату и время UTC в виде наивного объектаdatetime. Осведомлённый объект текущего времени UTC можно получить, вызвавdatetime.now(timezone.utc). См. такжеnow().Предупреждение
Поскольку наивные объекты
datetimeмногими методамиdatetimeрассматриваются как местное время, для представления времени в UTC предпочтительнее использовать осведомлённые объекты datetime. Поэтому рекомендуемый способ создания объекта, представляющего текущее время в UTC, – вызовdatetime.now(timezone.utc).Устарело с версии 3.12: Вместо этого используйте
datetime.now()с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.Изменено в версии 3.15: Принимает любое действительное число в качестве timestamp, а не только целое или число с плавающей запятой.
- classmethod datetime.utcfromtimestamp(timestamp)¶
Возвращает
datetimeUTC, соответствующий метке времени 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 предпочтительнее использовать aware-даты. Поэтому рекомендуемый способ создания объекта для конкретной метки времени в UTC – вызовdatetime.fromtimestamp(timestamp, tz=timezone.utc).Изменено в версии 3.3: Вызывает
OverflowErrorвместоValueError, если метка времени выходит за пределы диапазона значений, поддерживаемого функциейgmtime()платформы C. ВызываетOSErrorвместоValueErrorпри ошибкеgmtime().Изменено в версии 3.15: Принимает любое действительное число в качестве timestamp, а не только целое или число с плавающей запятой.
Устарело с версии 3.12: Вместо этого используйте
datetime.fromtimestamp()сUTC.
- classmethod datetime.fromordinal(ordinal)¶
Возвращает
datetime, соответствующий пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1.ValueErrorвызывается, если не выполнено1 <= ordinal <= datetime.max.toordinal(). Час, минута, секунда и микросекунда результата равны 0, аtzinfoравенNone.
- classmethod datetime.combine(date, time, tzinfo=time.tzinfo)¶
Возвращает новый объект
datetime, компоненты даты которого равны компонентам заданного объектаdate, а компоненты времени равны компонентам заданного объектаtime. Если указан аргумент tzinfo, его значение используется для установки атрибутаtzinfoрезультата, в противном случае используется атрибутtzinfoаргумента time. Если аргумент date является объектомdatetime, его компоненты времени и атрибутыtzinfoигнорируются.Для любого объекта
datetimed,d == datetime.combine(d.date(), d.time(), d.tzinfo).Изменено в версии 3.6: Добавлен аргумент tzinfo.
- classmethod datetime.fromisoformat(date_string)¶
Возвращает
datetime, соответствующий строке date_string в любом допустимом формате ISO 8601, за следующими исключениями:Смещения часовых поясов могут содержать доли секунды.
Разделитель
Tможет быть заменён любым отдельным символом Unicode.Доли часов и минут не поддерживаются.
Даты с пониженной точностью в настоящее время не поддерживаются (
YYYY-MM,YYYY).Расширенные представления дат в настоящее время не поддерживаются (
±YYYYYY-MM-DD).Порядковые даты в настоящее время не поддерживаются (
YYYY-OOO).
Примеры:
>>> import datetime as dt >>> dt.datetime.fromisoformat('2011-11-04') datetime.datetime(2011, 11, 4, 0, 0) >>> dt.datetime.fromisoformat('20111104') datetime.datetime(2011, 11, 4, 0, 0) >>> dt.datetime.fromisoformat('2011-11-04T00:05:23') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> dt.datetime.fromisoformat('2011-11-04T00:05:23Z') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc) >>> dt.datetime.fromisoformat('20111104T000523') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> dt.datetime.fromisoformat('2011-W01-2T00:05:23.283') datetime.datetime(2011, 1, 4, 0, 5, 23, 283000) >>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000) >>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283+00:00') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc) >>> dt.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.
Изменено в версии 3.11: Ранее этот метод поддерживал только форматы, которые могли быть созданы с помощью
date.isoformat()илиdatetime.isoformat().
- classmethod datetime.fromisocalendar(year, week, day)¶
Возвращает
datetime, соответствующий дате по ISO-календарю, заданной year, week и day. Компоненты datetime, не связанные с датой, заполняются обычными значениями по умолчанию. Это обратная функция отdatetime.isocalendar().Добавлено в версии 3.8.
- classmethod datetime.strptime(date_string, format)¶
Возвращает объект
datetime, соответствующий date_string, разобранный в соответствии с format.Если format не содержит микросекунд или информации о часовом поясе, это эквивалентно:
datetime(*(time.strptime(date_string, format)[0:6]))
ValueErrorвызывается, если date_string и format не могут быть разобраны с помощьюtime.strptime(), или если возвращается значение, не являющееся временным кортежем. См. также поведение strftime() и strptime() иdatetime.fromisoformat().Изменено в версии 3.15: Если format задаёт день месяца (
%d) без указания года, вызываетсяValueError. Это предотвращает ошибку из-за разницы високосных годов, проявляющуюся раз в четыре года: код, разбирающий только месяц и день, использует по умолчанию невисокосный год, так как год в формате не указан. Обходной путь – всегда указывать год в format. Если разбираются значения date_string без года, перед разбором явно добавьте високосный год:>>> import datetime as dt >>> date_string = "02/29" >>> when = dt.datetime.strptime(f"{date_string};1984", "%m/%d;%Y") # Избегает ошибки високосного года. >>> when.strftime("%B %d") 'February 29'
Атрибуты класса:
- 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) |
datetime1 == datetime2datetime1 != datetime2 |
Сравнение на равенство. (4) |
datetime1 < datetime2datetime1 > datetime2datetime1 <= datetime2datetime1 >= datetime2 |
Сравнение порядка. (5) |
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были сначала преобразованы в наивные объекты datetime в UTC. Результат –(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset()), за исключением того, что в реализации никогда не возникает переполнения.Объекты
datetimeравны, если они представляют одну и ту же дату и время с учётом часового пояса.Наивные и осознающие объекты
datetimeникогда не равны.Если оба операнда осознающие и имеют одинаковый атрибут
tzinfo, атрибутыtzinfoиfoldигнорируются, и сравниваются базовые даты и время. Если оба операнда осознающие и имеют разные атрибутыtzinfo, сравнение ведётся так, как если бы операнды сначала были преобразованы в даты и время в UTC, за исключением того, что реализация никогда не вызывает переполнение. Экземплярыdatetimeв повторяющемся интервале никогда не равны экземплярамdatetimeв другом часовом поясе.datetime1 считается меньше datetime2, когда datetime1 предшествует datetime2 во времени с учётом часового пояса.
Операция сравнения порядка между наивными и осознающими объектами
datetimeвызываетTypeError.Если оба операнда осознающие и имеют одинаковый атрибут
tzinfo, атрибутыtzinfoиfoldигнорируются, и сравниваются базовые даты и время. Если оба операнда осознающие и имеют разные атрибутыtzinfo, сравнение ведётся так, как если бы операнды сначала были преобразованы в даты и время в UTC, за исключением того, что реализация никогда не вызывает переполнение.
Изменено в версии 3.3: Сравнения на равенство между осознающими и наивными экземплярами datetime не вызывают TypeError.
Изменено в версии 3.13: Сравнение между объектом datetime и экземпляром подкласса date, который не является подклассом datetime, больше не преобразует последний в date, игнорируя временную часть и часовой пояс.
Поведение по умолчанию можно изменить, переопределив специальные методы сравнения в подклассах.
Методы экземпляра:
- datetime.time()¶
Возвращает объект
timeс теми же часами, минутами, секундами, микросекундами и fold.tzinfoравноNone. См. также методtimetz().Изменено в версии 3.6: Значение fold копируется в возвращаемый объект
time.
- datetime.timetz()¶
Возвращает объект
timeс теми же атрибутами hour, minute, second, microsecond, fold и tzinfo. См. также методtime().Изменено в версии 3.6: Значение fold копируется в возвращаемый объект
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также поддерживаются обобщённой функциейcopy.replace().Изменено в версии 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().Если нужно просто прикрепить объект
timezonetz к datetime dt без корректировки данных даты и времени, используйтеdt.replace(tzinfo=tz). Если нужно просто удалить объектtimezoneиз осознающего datetime dt без преобразования данных даты и времени, используйтеdt.replace(tzinfo=None).Обратите внимание, что метод по умолчанию
tzinfo.fromutc()можно переопределить в подклассеtzinfo, чтобы повлиять на результат, возвращаемыйastimezone(). Если не учитывать ошибки,astimezone()работает следующим образом:def astimezone(self, tz): if self.tzinfo is tz: return self # Преобразует self в UTC и присоединяет новый объект часового пояса. utc = (self - self.utcoffset()).replace(tzinfo=tz) # Преобразует из UTC в местное время tz. 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(). DST никогда не действует для времени UTC.Если
dосознанный,dнормализуется к времени UTC вычитаниемd.utcoffset(), и возвращаетсяtime.struct_timeдля нормализованного времени.tm_isdstпринудительно устанавливается в 0. Обратите внимание, что может быть возбужденоOverflowError, еслиd.yearбылоMINYEARилиMAXYEARи корректировка UTC выходит за границу года.Предупреждение
Поскольку наивные объекты
datetimeрассматриваются многими методамиdatetimeкак местное время, предпочтительнее использовать осознанные объекты datetime для представления времени в UTC; как результат, использованиеdatetime.utctimetuple()может давать вводящие в заблуждение результаты. Если у вас есть наивныйdatetime, представляющий UTC, используйтеdatetime.replace(tzinfo=timezone.utc), чтобы сделать его осознанным, после чего можно использоватьdatetime.timetuple().
- datetime.toordinal()¶
Возвращает пролептический григорианский порядковый номер даты. То же, что
self.date().toordinal().
- datetime.timestamp()¶
Возвращает временную метку POSIX, соответствующую экземпляру
datetime. Возвращаемое значение –float, похожее на то, что возвращаетсяtime.time().Naive
datetimeinstances are assumed to represent local time and this method relies on platform C functions to perform the conversion. Sincedatetimesupports a wider range of values than the platform C functions on many platforms, this method may raiseOverflowErrororOSErrorfor times far in the past or far in the future.Для осознанных экземпляров
datetimeвозвращаемое значение вычисляется как:(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
Примечание
Нет метода для получения временной метки POSIX непосредственно из наивного экземпляра
datetime, представляющего время UTC. Если ваше приложение использует это соглашение и часовой пояс вашей системы не установлен на UTC, вы можете получить временную метку POSIX, указавtzinfo=timezone.utc:timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
или вычислив метку напрямую:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
Добавлено в версии 3.3.
Изменено в версии 3.6: Метод
timestamp()использует атрибутfoldдля устранения неоднозначности моментов времени в течение повторяющегося интервала.Changed in version 3.6: This method no longer relies on the platform C
mktime()function to perform conversions.
- 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не равно 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
Примеры:
>>> import datetime as dt >>> dt.datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat() '2019-05-18T15:17:08.132263' >>> dt.datetime(2019, 5, 18, 15, 17, tzinfo=dt.timezone.utc).isoformat() '2019-05-18T15:17:00+00:00'
Необязательный аргумент sep (по умолчанию
'T') – это односимвольный разделитель, который ставится между частями даты и времени результата. Например:>>> import datetime as dt >>> class TZ(dt.tzinfo): ... """Часовой пояс с произвольным постоянным смещением -06:39.""" ... def utcoffset(self, when): ... return dt.timedelta(hours=-6, minutes=-39) ... >>> dt.datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ') '2002-12-25 00:00:00-06:39' >>> dt.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:>>> import datetime as dt >>> dt.datetime.now().isoformat(timespec='minutes') '2002-12-25T00:00' >>> my_datetime = dt.datetime(2015, 1, 1, 12, 30, 59, 0) >>> my_datetime.isoformat(timespec='microseconds') '2015-01-01T12:30:59.000000'
Изменено в версии 3.6: Добавлен параметр timespec.
- datetime.ctime()¶
Возвращает строку, представляющую дату и время:
>>> import datetime as dt >>> dt.datetime(2002, 12, 4, 20, 30, 40).ctime() 'Wed Dec 4 20:30:40 2002'
Результирующая строка не содержит информацию о часовом поясе независимо от того, является ли исходный объект aware или naive.
d.ctime()эквивалентно:time.ctime(time.mktime(d.timetuple()))
на платформах, где нативная C-функция
ctime()(которая вызывается вtime.ctime(), но не вызывается вdatetime.ctime()) соответствует стандарту C.
- datetime.strftime(format)¶
Возвращает строку, представляющую дату и время, с управлением через явную строку форматирования. См. также Поведение strftime() и strptime() и
datetime.isoformat().
- datetime.__format__(format)¶
То же, что
datetime.strftime(). Это позволяет задавать строку форматирования для объектаdatetimeв форматированных строковых литералах и при использованииstr.format(). См. также Поведение strftime() и strptime() иdatetime.isoformat().
Примеры использования: datetime¶Examples of usage: datetime
Примеры работы с объектами datetime:
>>> import datetime as dt
>>> # Использование datetime.combine()
>>> d = dt.date(2005, 7, 14)
>>> t = dt.time(12, 30)
>>> dt.datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)
>>> # Использование datetime.now()
>>> dt.datetime.now()
datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1
>>> dt.datetime.now(dt.timezone.utc)
datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)
>>> # Использование datetime.strptime()
>>> my_datetime = dt.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
>>> my_datetime
datetime.datetime(2006, 11, 21, 16, 30)
>>> # Использование datetime.timetuple() для получения кортежа всех атрибутов
>>> tt = my_datetime.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
>>> # Дата в формате ISO
>>> ic = my_datetime.isocalendar()
>>> for it in ic:
... print(it)
...
2006 # ISO year
47 # ISO week
2 # ISO weekday
>>> # Форматирование datetime
>>> my_datetime.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(my_datetime, "day", "month", "time")
'The day is 21, the month is November, the time is 04:30PM.'
В приведённом ниже примере определяется подкласс tzinfo, который фиксирует информацию о часовом поясе
для Кабула (Афганистан). До 1945 года там использовалось смещение +4 UTC, а затем +4:30 UTC:
import datetime as dt
class KabulTz(dt.tzinfo):
# В Кабуле до 1945 года использовали +4, затем перешли на +4:30
UTC_MOVE_DATE = dt.datetime(1944, 12, 31, 20, tzinfo=dt.timezone.utc)
def utcoffset(self, when):
if when.year < 1945:
return dt.timedelta(hours=4)
elif (1945, 1, 1, 0, 0) <= when.timetuple()[:5] < (1945, 1, 1, 0, 30):
# Неоднозначный («мнимый») получасовой диапазон, представляющий
# «складку» во времени из-за перехода с +4 на +4:30.
# Если when попадает в мнимый диапазон, используйте fold, чтобы решить, как
# разрешить неоднозначность. См. PEP 495.
return dt.timedelta(hours=4, minutes=(30 if when.fold else 0))
else:
return dt.timedelta(hours=4, minutes=30)
def fromutc(self, when):
# Следуйте тем же проверкам, что и в datetime.tzinfo
if not isinstance(when, dt.datetime):
raise TypeError("fromutc() requires a datetime argument")
if when.tzinfo is not self:
raise ValueError("when.tzinfo is not self")
# Для fromutc требуется собственная реализация, так как
# входные данные для этой функции – это datetime со значениями UTC
# но с tzinfo, установленным на self.
# См. datetime.astimezone или fromtimestamp.
if when.replace(tzinfo=dt.timezone.utc) >= self.UTC_MOVE_DATE:
return when + dt.timedelta(hours=4, minutes=30)
else:
return when + dt.timedelta(hours=4)
def dst(self, when):
# В Кабуле не соблюдается летнее время.
return dt.timedelta(0)
def tzname(self, when):
if when >= self.UTC_MOVE_DATE:
return "+04:30"
return "+04"
Использование KabulTz из примера выше:
>>> tz1 = KabulTz()
>>> # Datetime до изменения
>>> dt1 = dt.datetime(1900, 11, 21, 16, 30, tzinfo=tz1)
>>> print(dt1.utcoffset())
4:00:00
>>> # Datetime после изменения
>>> dt2 = dt.datetime(2006, 6, 14, 13, 0, tzinfo=tz1)
>>> print(dt2.utcoffset())
4:30:00
>>> # Преобразовать datetime в другой часовой пояс
>>> dt3 = dt2.astimezone(dt.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 objects
Объект 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 поддерживают сравнение на равенство и порядок,
где a считается меньше b, если a предшествует b во времени.
Наивные и осведомлённые объекты time никогда не равны.
Сравнение по порядку между наивными и осведомлёнными объектами time вызывает
TypeError.
Если оба сравниваемых объекта осведомлённые и имеют одинаковый атрибут tzinfo,
атрибуты tzinfo и fold игнорируются, и сравниваются базовые времена. Если оба сравниваемых объекта осведомлённые и
имеют разные атрибуты tzinfo, сравниваемые объекты сначала корректируются путём
вычитания их смещений UTC (полученных из self.utcoffset()).
Изменено в версии 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 в любом допустимом формате ISO 8601, со следующими исключениями:Смещения часовых поясов могут содержать доли секунды.
Ведущий символ
T, обычно обязательный в случаях, когда возможна неоднозначность между датой и временем, не требуется.Доли секунды могут содержать любое количество цифр (всё, что больше 6, будет усечено).
Доли часов и минут не поддерживаются.
Примеры:
>>> import datetime as dt >>> dt.time.fromisoformat('04:23:01') datetime.time(4, 23, 1) >>> dt.time.fromisoformat('T04:23:01') datetime.time(4, 23, 1) >>> dt.time.fromisoformat('T042301') datetime.time(4, 23, 1) >>> dt.time.fromisoformat('04:23:01.000384') datetime.time(4, 23, 1, 384) >>> dt.time.fromisoformat('04:23:01,000384') datetime.time(4, 23, 1, 384) >>> dt.time.fromisoformat('04:23:01+04:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400))) >>> dt.time.fromisoformat('04:23:01Z') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc) >>> dt.time.fromisoformat('04:23:01+00:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
Добавлено в версии 3.7.
Изменено в версии 3.11: Ранее этот метод поддерживал только форматы, которые могли быть возвращены
time.isoformat().
- classmethod time.strptime(date_string, format)¶
Возвращает объект
time, соответствующий date_string, разобранный в соответствии с format.Если format не содержит микросекунд или информации о часовом поясе, это эквивалентно:
time(*(time.strptime(date_string, format)[3:6]))
Исключение
ValueErrorвозникает, если date_string и format не могут быть разобраны с помощьюtime.strptime()или если возвращается значение, не являющееся временным кортежем. См. также поведение strftime() и strptime() иtime.fromisoformat().Добавлено в версии 3.14.
Методы экземпляра:
- time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)¶
Возвращает новый объект
timeс теми же значениями, но с обновлёнными указанными параметрами. Обратите внимание, чтоtzinfo=Noneможет быть указан для создания наивногоtimeиз осведомлённогоtimeбез преобразования данных времени.Объекты
timeтакже поддерживаются обобщённой функциейcopy.replace().Изменено в версии 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.Пример:
>>> import datetime as dt >>> dt.time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes') '12:34' >>> my_time = dt.time(hour=12, minute=34, second=56, microsecond=0) >>> my_time.isoformat(timespec='microseconds') '12:34:56.000000' >>> my_time.isoformat(timespec='auto') '12:34:56'
Изменено в версии 3.6: Добавлен параметр timespec.
- time.__str__()¶
Для времени
tstr(t)эквивалентноt.isoformat().
- time.strftime(format)¶
Возвращает строку, представляющую время, управляемую явной строкой формата. См. также поведение strftime() и strptime() и
time.isoformat().
- time.__format__(format)¶
То же, что и
time.strftime(). Это позволяет указать строку формата для объектаtimeв строковых литералах с форматированием и при использованииstr.format(). См. также поведение strftime() и strptime() иtime.isoformat().
- 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¶Examples of usage: time
Примеры работы с объектом time:
>>> import datetime as dt
>>> class TZ1(dt.tzinfo):
... def utcoffset(self, when):
... return dt.timedelta(hours=1)
... def dst(self, when):
... return dt.timedelta(0)
... def tzname(self, when):
... return "+01:00"
... def __repr__(self):
... return f"{self.__class__.__name__}()"
...
>>> t = dt.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 объекты¶tzinfo objects
- class datetime.tzinfo¶
Это абстрактный базовый класс, то есть этот класс не следует инстанциировать напрямую. Определите подкласс
tzinfoдля хранения информации о конкретном часовом поясе.Экземпляр (конкретного подкласса)
tzinfoможно передать конструкторам объектовdatetimeиtime. Последние рассматривают свои атрибуты как местное время, а объектtzinfoподдерживает методы, показывающие смещение местного времени от UTC, название часового пояса и смещение DST – все относительно переданного им объекта даты или времени.Необходимо создать конкретный подкласс и (как минимум) реализовать стандартные методы
tzinfo, необходимые для используемых методовdatetime. Модульdatetimeпредоставляетtimezone– простой конкретный подклассtzinfo, который может представлять часовые пояса с фиксированным смещением от UTC, такие как сам UTC или североамериканские EST и EDT.Особое требование для сериализации с помощью pickle: подкласс
tzinfoдолжен иметь метод__init__(), который можно вызвать без аргументов, иначе объект можно сериализовать, но возможно не удастся десериализовать обратно. Это техническое требование, которое может быть ослаблено в будущем.Конкретному подклассу
tzinfoможет потребоваться реализовать следующие методы. Какие именно методы нужны, зависит от того, как используются осведомлённые (aware) объектыdatetime. Если есть сомнения, просто реализуйте их все.
- tzinfo.utcoffset(dt)¶
Возвращает смещение местного времени от UTC в виде объекта
timedelta, которое положительно к востоку от UTC. Если местное время к западу от UTC, оно должно быть отрицательным.Это представляет общее смещение от UTC; например, если объект
tzinfoпредставляет как часовой пояс, так и корректировки DST,utcoffset()должен возвращать их сумму. Если смещение UTC неизвестно, вернитеNone. В противном случае возвращаемое значение должно быть объектомtimedeltaстрого между-timedelta(hours=24)иtimedelta(hours=24)(величина смещения должна быть меньше одного дня). Большинство реализацийutcoffset()будут выглядеть как один из этих двух вариантов:return CONSTANT # класс с фиксированным смещением return CONSTANT + self.dst(dt) # класс, учитывающий летнее время
Если
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()вызывает методdst()своего атрибутаtzinfo, чтобы определить, как должен быть установлен флаг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(), вероятно, будут выглядеть как один из этих двух вариантов:import datetime as dt def dst(self, when): # класс с фиксированным смещением: не учитывает летнее время return dt.timedelta(0)
или:
import datetime as dt def dst(self, when): # Код для установки dston и dstoff в значения летнего времени часового пояса # время перехода на основе входного when.year, выраженное # в стандартном местном времени. if dston <= when.replace(tzinfo=None) < dstoff: return dt.timedelta(hours=1) else: return dt.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()– скорректировать данные даты и времени, вернув эквивалентный datetime в местном времени self.Большинство подклассов
tzinfoдолжны без проблем наследовать реализацию по умолчаниюfromutc(). Она достаточно сильна, чтобы обрабатывать часовые пояса с фиксированным смещением, а также пояса, учитывающие стандартное и летнее время, причём последние – даже если время перехода на летнее время различается в разные годы. Пример часового пояса, который реализация по умолчаниюfromutc()может обрабатывать неправильно в некоторых случаях, – это пояс, где стандартное смещение (от UTC) зависит от конкретной переданной даты и времени, что может происходить по политическим причинам. Реализации по умолчаниюastimezone()иfromutc()могут не дать желаемого результата, если результат приходится на часы, пересекающие момент изменения стандартного смещения.Опуская код для обработки ошибок, реализация по умолчанию
fromutc()работает следующим образом:import datetime as dt def fromutc(self, when): # вызывает ValueError, если when.tzinfo не является self dtoff = when.utcoffset() dtdst = when.dst() # вызывает ValueError, если dtoff или dtdst равны None delta = dtoff - dtdst # это стандартное смещение self if delta: when += delta # преобразовать в стандартное местное время dtdst = when.dst() # вызывает ValueError, если dtdst равен None if dtdst: return when + dtdst else: return when
В следующем файле tzinfo_examples.py приведены некоторые примеры классов tzinfo:
import datetime as dt
# Класс, отражающий представление платформы о местном времени.
# (Может приводить к неверным значениям для исторических моментов в
# часовых поясах, где UTC-смещение и/или правила летнего времени
# менялись в прошлом.)
import time
ZERO = dt.timedelta(0)
HOUR = dt.timedelta(hours=1)
SECOND = dt.timedelta(seconds=1)
STDOFFSET = dt.timedelta(seconds=-time.timezone)
if time.daylight:
DSTOFFSET = dt.timedelta(seconds=-time.altzone)
else:
DSTOFFSET = STDOFFSET
DSTDIFF = DSTOFFSET - STDOFFSET
class LocalTimezone(dt.tzinfo):
def fromutc(self, when):
assert when.tzinfo is self
stamp = (when - dt.datetime(1970, 1, 1, tzinfo=self)) // SECOND
args = time.localtime(stamp)[:6]
dst_diff = DSTDIFF // SECOND
# Обнаружение fold
fold = (args == time.localtime(stamp - dst_diff))
return dt.datetime(*args, microsecond=when.microsecond,
tzinfo=self, fold=fold)
def utcoffset(self, when):
if self._isdst(when):
return DSTOFFSET
else:
return STDOFFSET
def dst(self, when):
if self._isdst(when):
return DSTDIFF
else:
return ZERO
def tzname(self, when):
return time.tzname[self._isdst(when)]
def _isdst(self, when):
tt = (when.year, when.month, when.day,
when.hour, when.minute, when.second,
when.weekday(), 0, 0)
stamp = time.mktime(tt)
tt = time.localtime(stamp)
return tt.tm_isdst > 0
Local = LocalTimezone()
# Полная реализация текущих правил летнего времени для основных часовых поясов США.
def first_sunday_on_or_after(when):
days_to_go = 6 - when.weekday()
if days_to_go:
when += dt.timedelta(days_to_go)
return when
# Правила летнего времени в США
#
# Это упрощённый набор правил для США (т.е. неверный для некоторых случаев)
# времени начала и окончания летнего времени. Полный и актуальный набор правил летнего времени
# и определений часовых поясов смотрите в базе данных Olson (или попробуйте pytz):
# http://www.twinsun.com/tz/tz-link.htm
# https://sourceforge.net/projects/pytz/ (возможно, не актуально)
#
# В США с 2007 года летнее время начинается в 2 часа ночи (стандартное время) во второе
# воскресенье марта, то есть первое воскресенье 8 марта или после него.
DSTSTART_2007 = dt.datetime(1, 3, 8, 2)
# и заканчивается в 2 часа ночи (летнее время) в первое воскресенье ноября.
DSTEND_2007 = dt.datetime(1, 11, 1, 2)
# С 1987 по 2006 год летнее время начиналось в 2 часа ночи (стандартное время) в первое
# воскресенье апреля и заканчивалось в 2 часа ночи (летнее время) в последнее
# воскресенье октября, то есть первое воскресенье 25 октября или после него.
DSTSTART_1987_2006 = dt.datetime(1, 4, 1, 2)
DSTEND_1987_2006 = dt.datetime(1, 10, 25, 2)
# С 1967 по 1986 год летнее время начиналось в 2 часа ночи (стандартное время) в последнее
# воскресенье апреля (то есть 24 апреля или после него) и заканчивалось в 2 часа ночи (летнее время)
# в последнее воскресенье октября, которое является первым воскресеньем
# 25 октября или позднее.
DSTSTART_1967_1986 = dt.datetime(1, 4, 24, 2)
DSTEND_1967_1986 = DSTEND_1987_2006
def us_dst_range(year):
# Найти время начала и окончания перехода на летнее время в США. Для лет до 1967 года вернуть
# start = end, если летнее время не применяется.
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 (dt.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(dt.tzinfo):
def __init__(self, hours, reprname, stdname, dstname):
self.stdoffset = dt.timedelta(hours=hours)
self.reprname = reprname
self.stdname = stdname
self.dstname = dstname
def __repr__(self):
return self.reprname
def tzname(self, when):
if self.dst(when):
return self.dstname
else:
return self.stdname
def utcoffset(self, when):
return self.stdoffset + self.dst(when)
def dst(self, when):
if when is None or when.tzinfo is None:
# В одном или обоих случаях здесь может быть уместно исключение.
# Это зависит от того, как вы хотите их обрабатывать. Реализация по умолчанию
# fromutc() (вызываемая реализацией astimezone() по умолчанию)
# передаёт объект datetime, у которого when.tzinfo равен self.
return ZERO
assert when.tzinfo is self
start, end = us_dst_range(when.year)
# Нельзя сравнивать наивные и осведомлённые объекты, поэтому сначала удалите часовой пояс из
# when.
when = when.replace(tzinfo=None)
if start + HOUR <= when < end - HOUR:
# Действует летнее время.
return HOUR
if end - HOUR <= when < end:
# Fold (неоднозначный час): используйте when.fold для разрешения неоднозначности.
return ZERO if when.fold else HOUR
if start <= when < start + HOUR:
# Gap (несуществующий час): примените обратное правило fold.
return HOUR if when.fold else ZERO
# Летнее время не действует.
return ZERO
def fromutc(self, when):
assert when.tzinfo is self
start, end = us_dst_range(when.year)
start = start.replace(tzinfo=self)
end = end.replace(tzinfo=self)
std_time = when + self.stdoffset
dst_time = std_time + HOUR
if end <= dst_time < end + HOUR:
# Повторяющийся час
return std_time.replace(fold=1)
if std_time < start or dst_time >= end:
# Стандартное время
return std_time
if start <= std_time < end - HOUR:
# Летнее время
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, учитывающем как стандартное, так и летнее время, дважды в год в точках перехода на летнее время возникают неизбежные тонкости. Для конкретики рассмотрим восточное время США (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
Когда начинается летнее время (строка «start»), местные настенные часы перескакивают с 1:59 на 3:00. Местное время вида 2:MM в этот день не имеет смысла, поэтому astimezone(Eastern) не вернёт результат с hour == 2 в день начала DST. Например, при переходе на летнее время весной 2016 года мы получаем:
>>> import datetime as dt
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = dt.datetime(2016, 3, 13, 5, tzinfo=dt.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
Когда заканчивается летнее время (строка «end»), возникает потенциально более серьёзная проблема: есть час, который невозможно однозначно выразить в местном настенном времени – последний час летнего времени. В восточном поясе это время вида 5:MM UTC в день окончания летнего времени. Местные настенные часы перескакивают с 1:59 (летнее время) обратно на 1:00 (стандартное время). Местные времена вида 1:MM становятся неоднозначными. astimezone() имитирует поведение местных часов, отображая два соседних часа UTC в один и тот же местный час. В примере с восточным поясом времена UTC вида 5:MM и 6:MM оба отображаются в 1:MM при преобразовании в восточное время, но у более ранних времен атрибут fold установлен в 0, а у более поздних – в 1. Например, при переходе на зимнее время осенью 2016 года мы получаем:
>>> import datetime as dt
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = dt.datetime(2016, 11, 6, 4, tzinfo=dt.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(экземпляр UTCtimezone).
zoneinfoпредоставляет Python базу данных IANA time zone database (также известную как база данных Olson), и её использование рекомендуется.
- база данных часовых поясов IANA
База данных часовых поясов (часто называемая tz, tzdata или zoneinfo) содержит код и данные, представляющие историю местного времени для множества характерных мест по всему миру. Она периодически обновляется, чтобы отражать изменения, вносимые политическими органами в границы часовых поясов, смещения UTC и правила перехода на летнее время.
timezone объекты¶timezone objects
Класс timezone является подклассом tzinfo, каждый экземпляр которого представляет часовой пояс, определяемый фиксированным смещением от UTC.
Объекты этого класса нельзя использовать для представления информации о часовом поясе в местах, где в разные дни года используются разные смещения или где в гражданское время вносились исторические изменения.
- class datetime.timezone(offset[, name])¶
Аргумент 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()¶strftime() and strptime() behavior
Объекты date, datetime и time поддерживают метод
strftime(format), который создаёт строку, представляющую время с использованием явной строки формата.
И наоборот, методы классов date.strptime(), datetime.strptime() и
time.strptime() создают объект из строки, представляющей время, и соответствующей строки формата.
Приведённая ниже таблица даёт высокоуровневое сравнение strftime()
и strptime():
|
|
|
|---|---|---|
Использование |
Преобразовать объект в строку по заданному формату |
Разобрать строку в объект по соответствующему формату |
Тип метода |
Метод экземпляра |
Метод класса |
Сигнатура |
|
|
Коды формата strftime() и strptime()¶strftime() and strptime() format codes
Эти методы принимают коды формата, которые можно использовать для разбора и форматирования дат:
>>> import datetime as dt
>>> dt.datetime.strptime('31/01/22 23:59:59.999999',
... '%d/%m/%y %H:%M:%S.%f')
datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)
>>> _.strftime('%a %d %b %Y, %I:%M%p')
'Mon 31 Jan 2022, 11:59PM'
Ниже приведён список всех кодов форматирования, которые требуются стандартом C 2011 года. Они работают на всех поддерживаемых платформах.
Директива |
Значение |
Пример |
Примечания |
|---|---|---|---|
|
День недели как сокращённое название в локали. |
Sun, Mon, …, Sat
(en_US);
So, Mo, …, Sa
(de_DE)
|
(1) |
|
Название дня недели в полной форме, зависящее от локали. |
Sunday, Monday, …,
Saturday (en_US);
Sonntag, Montag, …,
Samstag (de_DE)
|
(1) |
|
Название месяца в сокращённой форме, зависящей от локали. |
Jan, Feb, …, Dec
(en_US);
Jan, Feb, …, Dez
(de_DE)
|
(1) |
|
Название месяца в полной форме, зависящей от локали. |
January, February,
…, December (en_US);
Januar, Februar, …,
Dezember (de_DE)
|
(1) |
|
Представление даты и времени, подходящее для локали. |
Tue Aug 16 21:30:00
1988 (en_US);
Di 16 Aug 21:30:00
1988 (de_DE)
|
(1) |
|
Год, делённый на 100 и усечённый до целого, в виде десятичного числа, дополненного нулями слева. |
01, 02, …, 99 |
(0) |
|
День месяца в виде десятичного числа, дополненного слева нулями. |
01, 02, …, 31 |
(9), (10) |
|
Эквивалентно |
11/28/25 |
(9) |
|
День месяца в виде десятичного числа, дополненного пробелами слева. |
␣1, ␣2, …, 31 |
(10) |
|
Эквивалентно |
2025-10-11, 1001-12-30 |
|
|
Последние две цифры года ISO 8601,
обозначающие год, в который входит
большая часть ISO-недели ( |
00, 01, …, 99 |
(0) |
|
Год по ISO 8601 с веком,
представляющий год, который
содержит большую часть
недели по ISO 8601 ( |
0001, 0002, …, 2013, 2014, …, 9998, 9999 |
(8) |
|
Эквивалентно |
См. |
(0) |
|
Часы (в 24-часовом формате) в виде десятичного числа, дополненного слева нулями. |
00, 01, …, 23 |
(9) |
|
Часы (в 12-часовом формате) в виде десятичного числа, дополненного слева нулями. |
01, 02, …, 12 |
(9) |
|
День года в виде десятичного числа, дополненного слева нулями. |
001, 002, …, 366 |
(9) |
|
Месяц в виде десятичного числа, дополненного слева нулями. |
01, 02, …, 12 |
(9) |
|
Минуты в виде десятичного числа, дополненного слева нулями. |
00, 01, …, 59 |
(9) |
|
Символ новой строки
( |
|
|
|
Эквивалент AM или PM, зависящий от локали. |
AM, PM (en_US);
am, pm (de_DE)
|
(1), (3) |
|
Время в 12-часовом формате, принятое в локали. |
12:00:00 AM |
(1), (0) |
|
Эквивалентно |
10:01 |
|
|
Секунды в виде десятичного числа, дополненного слева нулями. |
00, 01, …, 59 |
(4), (9) |
|
Символ табуляции ( |
|
|
|
Формат времени ISO 8601,
эквивалентный |
10:01:59 |
|
|
День недели по ISO 8601 в виде десятичного числа, где 1 – понедельник. |
1, 2, …, 7 |
|
|
Номер недели в году (воскресенье – первый день недели) в виде десятичного числа, дополненного слева нулями. Все дни в новом году до первого воскресенья считаются неделей 0. |
00, 01, …, 53 |
(7), (9) |
|
Неделя по ISO 8601 в виде десятичного числа, где понедельник считается первым днём недели. Неделя 01 – это неделя, содержащая 4 января. |
01, 02, …, 53 |
(8), (9) |
|
День недели в виде десятичного числа, где 0 – воскресенье, а 6 – суббота. |
0, 1, …, 6 |
|
|
Номер недели в году (понедельник – первый день недели) в виде десятичного числа, дополненного слева нулями. Все дни в новом году до первого понедельника считаются неделей 0. |
00, 01, …, 53 |
(7), (9) |
|
Представление даты, соответствующее локали. |
08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
|
(1) |
|
Представление времени, соответствующее локали. |
21:30:00 (en_US);
21:30:00 (de_DE)
|
(1) |
|
Год без столетия в виде десятичного числа, дополненного слева нулями. |
00, 01, …, 99 |
(9) |
|
Год со столетием в виде десятичного числа. |
0001, 0002, …, 2013, 2014, …, 9998, 9999 |
(2) |
|
Смещение UTC в формате
|
(пусто), +0000, -0400, +1030, +063415, -030712.345216 |
(6) |
|
Название часового пояса (пустая строка, если объект наивный). |
(пусто), UTC, GMT |
(6) |
|
Литеральный символ |
% |
Директивы года ISO 8601 и недели ISO 8601 не взаимозаменяемы
с указанными выше директивами года и номера недели. Вызов strptime() с
неполными или неоднозначными директивами ISO 8601 приведёт к возникновению ValueError.
Для удобства включено несколько дополнительных директив, не требуемых стандартом C11.
Директива |
Значение |
Пример |
Примечания |
|---|---|---|---|
|
Микросекунды в виде десятичного числа, дополненного слева нулями до 6 цифр. |
000000, 000001, …, 999999 |
(5) |
|
Смещение UTC в формате
|
(пусто), +00:00, -04:00, +10:30, +06:34:15, -03:07:12.345216 |
(6) |
Полный набор поддерживаемых кодов формата зависит от платформы, поскольку Python вызывает функцию strftime() из библиотеки C платформы, а различия между платформами распространены. Чтобы увидеть полный набор кодов формата, поддерживаемых на вашей платформе, обратитесь к документации strftime(3). Также существуют различия между платформами в обработке неподдерживаемых спецификаторов формата.
Добавлено в версии 3.6: %G, %u и %V были добавлены.
Добавлено в версии 3.12: %:z был добавлен для strftime().
Добавлено в версии 3.15: %D, %F, %n, %t и %:z были добавлены для strptime().
Техническая подробность¶Technical detail
В целом, d.strftime(fmt) действует как time из модуля
time.strftime(fmt, d.timetuple()), хотя не все объекты поддерживают
метод timetuple().
Для методов класса datetime.strptime() и date.strptime()
значение по умолчанию равно 1900-01-01T00:00:00.000: любые компоненты, не указанные
в строке формата, будут взяты из значения по умолчанию.
Примечание
Строки формата без разделителей могут быть неоднозначными для разбора. Например,
при %Y%m%d строка 2026111 может быть разобрана как
2026-11-01 или как 2026-01-11.
Используйте разделители, чтобы гарантировать, что входные данные разбираются так, как задумано.
Примечание
При использовании для разбора частичных дат без указания года datetime.strptime()
и date.strptime() вызовут ошибку при обнаружении 29 февраля, поскольку
год по умолчанию 1900 не является високосным. Всегда добавляйте високосный год
по умолчанию к строкам частичных дат перед разбором.
>>> import datetime as dt
>>> value = "2/29"
>>> dt.datetime.strptime(value, "%m/%d")
Traceback (most recent call last):
...
ValueError: day 29 must be in range 1..28 for month 2 in year 1900
>>> dt.datetime.strptime(f"1904 {value}", "%Y %m/%d")
datetime.datetime(1904, 2, 29, 0, 0)
Использование 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 или вернуть
пустую строку.
Примечания:
Этот код формата в настоящее время не поддерживается
strptime().Поскольку формат зависит от текущей локали, следует проявлять осторожность при построении предположений о выходном значении. Порядок полей различается (например, «месяц/день/год» против «день/месяц/год»), и вывод может содержать не-ASCII символы.
Метод
strptime()может разбирать годы в полном диапазоне [1, 9999], но годы < 1000 должны быть дополнены нулями до 4-значной ширины.Изменено в версии 3.2: В предыдущих версиях метод
strftime()был ограничен gодами >= 1900.Изменено в версии 3.3: В версии 3.2 метод
strftime()был ограничен gодами >= 1000.При использовании с методом
strptime()директива%pвлияет только на поле вывода часа, если директива%Iиспользуется для разбора часа.В отличие от модуля
time, модульdatetimeне поддерживает високосные секунды.При использовании с методом
strptime()директива%fпринимает от одной до шести цифр и дополняет нулями справа.%fявляется расширением набора символов форматирования в стандарте C (но реализован отдельно в объектах datetime, поэтому всегда доступен).Для наивного объекта коды форматирования
%z,%: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 могут содержать двоеточие в качестве разделителя между часами, минутами и секундами. Например, как'+010000', так и'+01:00:00'будут разобраны как смещение в один час. Кроме того, указание'Z'идентично'+00:00'.%:zПри использовании с
strftime()ведёт себя в точности как%z, за исключением того, что между часами, минутами и секундами добавляется разделитель в виде двоеточия.При использовании с
strptime()смещение UTC должно содержать двоеточие в качестве разделителя между часами, минутами и секундами. Например,'+01:00:00'(но не'+010000') будет разобрано как смещение в один час. Кроме того, указание'Z'идентично'+00:00'.%ZВ
strftime()%Zзаменяется пустой строкой, еслиtzname()возвращаетNone; в противном случае%Zзаменяется возвращённым значением, которое должно быть строкой.strptime()принимает только определённые значения для%Z:любое значение из
time.tznameдля локали вашей системыжёстко заданные значения
UTCиGMT
Так, человек, живущий в Японии, может иметь
JST,UTCиGMTв качестве допустимых значений, но, вероятно, неEST. Для недопустимых значений будет возбужденоValueError.
Изменено в версии 3.2: Когда директива
%zпередаётся методуstrptime(), будет создан осведомлённый объектdatetime. Атрибутtzinfoрезультата будет установлен в экземплярtimezone.При использовании с методом
strptime()%Uи%Wиспользуются только в вычислениях, когда указаны день недели и календарный год (%Y).Аналогично
%Uи%W,%Vиспользуется только в вычислениях, когда день недели и год по ISO (%G) указаны в строке форматированияstrptime(). Также обратите внимание, что%Gи%Yне являются взаимозаменяемыми.При использовании с методом
strptime()ведущий ноль является необязательным для форматов%d,%m,%H,%I,%M,%S,%j,%U,%Wи%V. Формат%yтребует ведущего нуля.При разборе месяца и дня с помощью
strptime()всегда включайте год в формат. Если разбираемое значение не содержит года, добавьте явный фиктивный високосный год. В противном случае ваш код возбудит исключение при обнаружении високосного дня, так как год по умолчанию, используемый парсером (1900), не является високосным. Пользователи сталкиваются с этой ошибкой каждый високосный год.>>> month_day = "02/29" >>> dt.datetime.strptime(f"{month_day};1984", "%m/%d;%Y") # Нет ошибки високосного года. datetime.datetime(1984, 2, 29, 0, 0)
Изменено в версии 3.15: Использование
%dбез указания года теперь вызываетValueError.Устарело с версии 3.15, будет удалено в версии 3.17: Вызовы
strptime()с использованием строки формата, содержащей%eбез года, теперь выдаютDeprecationWarning.
Сноски
Эта страница – перевод. Оригинал на английском – docs.python.org. Нашли неточность? Сообщите нам.