datetime — Основные типы дат и времени
Исходный код: Lib/datetime.py
Модуль datetime предоставляет классы для работы с датами и временем.
Хотя арифметика дат и времени поддерживается, основное внимание при реализации уделяется эффективному извлечению атрибутов для форматирования и обработки вывода.
Подсказка
Перейти к кодам форматирования.
См. также
-
Modulecalendar -
Общие функции, связанные с календарем.
-
Moduletime -
Доступ к времени и преобразования.
-
Modulezoneinfo -
Конкретные часовые пояса, представляющие базу данных часовых поясов IANA.
- Пакет dateutil
-
Библиотека сторонних разработчиков с расширенной поддержкой часовых поясов и парсинга.
- Пакет DateType
-
Библиотека сторонних разработчиков, которая вводит отдельные статические типы, чтобы, например, позволить статическим проверкам типов различать наивные и осознанные объекты datetime.
Осознанные и наивные объекты
Объекты дат и времени могут быть классифицированы как «осознанные» или «наивные» в зависимости от того, содержат ли они информацию о часовом поясе.
Обладая достаточными знаниями о применимых алгоритмических и политических корректировках времени, таких как часовой пояс и летнее время, осознанный объект может определить своё положение относительно других осознанных объектов. Осознанный объект представляет определённый момент времени, который не допускает интерпретации. [1]
Наивный объект не содержит достаточной информации, чтобы однозначно определить своё положение относительно других объектов даты/времени. Представляет ли наивный объект Координированное универсальное время (UTC), местное время или время в каком-либо другом часовом поясе — зависит исключительно от программы, точно так же, как и то, представляет ли определённое число метры, мили или массу. Наивные объекты просты для понимания и работы с ними, но при этом игнорируются некоторые аспекты реальности.
Для приложений, требующих осознанных объектов, объекты datetime и time имеют необязательный атрибут информации о часовом поясе, tzinfo, который может быть задан экземпляром подкласса абстрактного класса tzinfo. Эти объекты tzinfo фиксируют информацию об отступе от UTC, имени часового пояса и о том, действует ли летнее время.
Модуль datetime предоставляет только один конкретный класс tzinfo, класс timezone. Класс timezone может представлять простые часовые пояса с фиксированными смещениями от UTC, такими как UTC само по себе или североамериканские часовые пояса EST и EDT. Поддержка часовых поясов на более глубоком уровне детализации зависит от приложения. Правила корректировки времени по всему миру более политические, чем рациональные, часто меняются, и не существует стандарта, подходящего для каждого приложения, кроме UTC.
Константы
Модуль datetime экспортирует следующие константы:
-
datetime.MINYEAR -
Наименьшее значение года, разрешённое в объекте
dateилиdatetime.MINYEARравно 1.
-
datetime.MAXYEAR -
Наибольшее значение года, разрешённое в объекте
dateилиdatetime.MAXYEARравно 9999.
-
datetime.UTC -
Псевдоним для синглетона часового пояса UTC
datetime.timezone.utc.Добавлен в версии 3.11.
Доступные типы
- 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.
Объекты этих типов неизменяемы.
Взаимосвязи классов:
object
timedelta
tzinfo
timezone
time
date
datetime
Общие свойства
Типы date, datetime, time и timezone обладают следующими общими свойствами:
- Объекты этих типов неизменяемы.
- Объекты этих типов являются хешируемыми, что означает, что они могут использоваться в качестве ключей словарей.
- Объекты этих типов поддерживают эффективную сериализацию с помощью модуля
pickle.
Определение, является ли объект осознанным или наивным
Объекты типа date всегда наивные.
Объект типа time или datetime может быть осознанным или наивным.
Объект datetime d считается осознанным, если выполняются оба следующих условия:
-
d.tzinfoнеNone -
d.tzinfo.utcoffset(d)не возвращаетNone
В противном случае, d является наивным.
Объект time t считается осознанным, если выполняются оба следующих условия:
-
t.tzinfoнеNone -
t.tzinfo.utcoffset(None)не возвращаетNone.
В противном случае, t является наивным.
Различие между осознанным и наивным не относится к объектам timedelta.
Объекты timedelta
Объект timedelta представляет собой продолжительность, разницу между двумя объектами datetime или date.
-
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) -
Все аргументы необязательны и по умолчанию равны 0. Аргументы могут быть целыми или плавающими числами, положительными или отрицательными.
Внутренне хранятся только дни, секунды и микросекунды. Аргументы преобразуются в эти единицы:
- Миллисекунда преобразуется в 1000 микросекунд.
- Минута преобразуется в 60 секунд.
- Час преобразуется в 3600 секунд.
- Неделя преобразуется в 7 дней.
а затем дни, секунды и микросекунды нормализуются так, чтобы представление было уникальным, с
0 <= microseconds < 1000000-
0 <= seconds < 3600*24(количество секунд в одном дне) -999999999 <= days <= 999999999
Следующий пример демонстрирует, как любые аргументы, кроме days, seconds и microseconds, «сливаются» и нормализуются в эти три атрибута:
>>> from datetime import timedelta >>> delta = timedelta( ... days=50, ... seconds=27, ... microseconds=10, ... milliseconds=29000, ... minutes=5, ... hours=8, ... weeks=2 ... ) >>> # Only days, seconds, and microseconds remain >>> delta datetime.timedelta(days=64, seconds=29156, microseconds=10)
Если какой-либо аргумент является числом с плавающей точкой, а также есть дробные микросекунды, дробные микросекунды от всех аргументов объединяются, и их сумма округляется до ближайшей микросекунды с использованием правила округления «при равных условиях — к ближайшему четному». Если ни один аргумент не является числом с плавающей точкой, процессы преобразования и нормализации точны (никакая информация не теряется).
Если нормализованное значение дней выходит за указанный диапазон, генерируется исключение
OverflowError.Обратите внимание, что нормализация отрицательных значений может быть неожиданной на первый взгляд. Например:
>>> from datetime import timedelta >>> d = timedelta(microseconds=-1) >>> (d.days, d.seconds, d.microseconds) (-1, 86399, 999999)
Атрибуты класса:
-
timedelta.min -
Наибольший отрицательный объект
timedelta,timedelta(-999999999).
-
timedelta.max -
Наибольший положительный объект
timedelta,timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999).
-
timedelta.resolution -
Наименьшая возможная разница между неравными объектами
timedelta,timedelta(microseconds=1).
Обратите внимание, что из-за нормализации timedelta.max больше, чем -timedelta.min. -timedelta.max не может быть представлен как объект timedelta.
Атрибуты экземпляра (только для чтения):
-
timedelta.days -
От -999 999 999 до 999 999 999 включительно.
-
timedelta.seconds -
От 0 до 86 399 включительно.
Внимание
Довольно распространённой ошибкой является непреднамеренное использование этого атрибута, когда на самом деле требуется получить значение
total_seconds():>>> from datetime import timedelta >>> duration = timedelta(seconds=11235813) >>> duration.days, duration.seconds (130, 3813) >>> duration.total_seconds() 11235813.0
-
timedelta.microseconds -
От 0 до 999 999 включительно.
Поддерживаемые операции:
Операция | Результат |
|---|---|
| Сумма |
| Разность |
| Дельта, умноженная на целое число. После этого |
В общем случае, | |
| Дельта, умноженная на число с плавающей точкой. Результат округляется до ближайшего кратного timedelta.resolution с использованием правила округления «при равных условиях — к ближайшему четному». |
| Деление (3) общей продолжительности |
| Дельта, деленная на число с плавающей точкой или целое число. Результат округляется до ближайшего кратного timedelta.resolution с использованием правила округления «при равных условиях — к ближайшему четному». |
| Вычисляется целая часть и отбрасывается остаток (если есть). Во втором случае возвращается целое число. (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
Дополнительный пример нормализации:
>>> # 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, соответствующий строке date_string, заданной в любом допустимом формате ISO 8601, за исключением следующих:- Даты с уменьшенной точностью в настоящее время не поддерживаются (
YYYY-MM,YYYY). - Расширенные представления дат в настоящее время не поддерживаются (
±YYYYYY-MM-DD). - Порядковые даты в настоящее время не поддерживаются (
YYYY-OOO).
Примеры:
>>> from datetime import date >>> date.fromisoformat('2019-12-04') datetime.date(2019, 12, 4) >>> date.fromisoformat('20191204') datetime.date(2019, 12, 4) >>> 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-календаря, указанной годом, неделями и днём. Это обратная функцияdate.isocalendar().Добавлена в версии 3.8.
Атрибуты класса:
-
date.min -
Самая ранняя представимая дата,
date(MINYEAR, 1, 1).
-
date.max -
Самая поздняя представимая дата,
date(MAXYEAR, 12, 31).
-
date.resolution -
Наименьшее возможное различие между неравными объектами date,
timedelta(days=1).
Атрибуты экземпляра (только для чтения):
-
date.month -
Между 1 и 12 включительно.
-
date.day -
Между 1 и количеством дней в данном месяце данного года.
Поддерживаемые операции:
Операция | Результат |
|---|---|
|
|
| Вычисляет |
| (3) |
Сравнение на равенство. (4) | |
Сравнение по порядку. (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) -
Возвращает дату с теми же значениями, за исключением параметров, получивших новые значения в указанных ключевых аргументах.
Пример:
>>> from datetime import date >>> d = date(2002, 12, 31) >>> d.replace(day=26) datetime.date(2002, 12, 26)
Объекты
dateтакже поддерживаются универсальной функциейcopy.replace().
-
date.timetuple() -
Возвращает
time.struct_time, аналогичный возвращаемому функциейtime.localtime().Часы, минуты и секунды равны 0, а флаг DST равен -1.
d.timetuple()эквивалентно:time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))
где
yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1— порядковый номер дня в текущем году, начиная с 1 для 1 января.
-
date.toordinal() -
Возвращает пролептический григорианский порядковый номер даты, где 1 января года 1 имеет порядковый номер 1. Для любого объекта
dated,date.fromordinal(d.toordinal()) == d.
-
date.weekday() -
Возвращает день недели в виде целого числа, где понедельник — 0, а воскресенье — 6. Например,
date(2002, 12, 4).weekday() == 2, среда. См. такжеisoweekday().
-
date.isoweekday() -
Возвращает день недели в виде целого числа, где понедельник — 1, а воскресенье — 7. Например,
date(2002, 12, 4).isoweekday() == 3, среда. См. такжеweekday(),isocalendar().
-
date.isocalendar() -
Возвращает объект именованной кортежа с тремя компонентами:
year,weekиweekday.ISO-календарь — широко используемый вариант григорианского календаря. [3]
Год по ISO-календарю состоит из 52 или 53 полных недель, где неделя начинается с понедельника и заканчивается в воскресенье. Первая неделя ISO-года — это первая (григорианская) неделя года, содержащая четверг. Это неделя номер 1, а ISO-год этого четверга совпадает с его григорианским годом.
Например, 2004 год начинается с четверга, поэтому первая неделя ISO-года 2004 начинается в понедельник, 29 декабря 2003 года, и заканчивается в воскресенье, 4 января 2004 года:
>>> from datetime import date >>> date(2003, 12, 29).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=1) >>> date(2004, 1, 4).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
Изменено в версии 3.9: Результат изменён с кортежа на именованную кортеж.
-
date.isoformat() -
Возвращает строку, представляющую дату в формате ISO 8601,
YYYY-MM-DD:>>> from datetime import date >>> date(2002, 12, 4).isoformat() '2002-12-04'
-
date.__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.isoformat().
-
date.__format__(format) -
То же, что и
date.strftime(). Это позволяет указать строку формата для объектаdateв форматируемых строковых литералах и при использованииstr.format(). См. также Поведение strftime() и strptime() иdate.isoformat().
Примеры использования: 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) -
Аргументы 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. Таким образом, рекомендуемый способ создания объекта, представляющего текущее время в 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, если временная метка выходит за пределы диапазона значений, поддерживаемых функциями C платформыlocaltime()илиgmtime(), иOSErrorприlocaltime()илиgmtime()ошибке. Часто это ограничение накладывается на годы с 1970 по 2038 год. Обратите внимание, что на не-POSIX системах, включающих високосные секунды в их понятие временной метки, високосные секунды игнорируются методомfromtimestamp(), и тогда возможно, что две временные метки, отличающиеся на секунду, дадут идентичные объектыdatetime. Этот метод предпочтительнееutcfromtimestamp().Изменено в версии 3.3: Поднять исключение
OverflowErrorвместоValueError, если временная метка выходит за пределы диапазона значений, поддерживаемых функциями C платформыlocaltime()илиgmtime(). Поднять исключениеOSErrorвместоValueErrorприlocaltime()илиgmtime()ошибке.Изменено в версии 3.6:
fromtimestamp()может возвращать экземпляры сfold, установленным в 1.
-
classmethod datetime.utcfromtimestamp(timestamp) -
Возвращает объект
datetimeв UTC, соответствующий указанному временной метке 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как локальное время, рекомендуется использовать осознанные datetime для представления времени в UTC. Таким образом, рекомендуемый способ создания объекта, представляющего конкретную временную метку в UTC, - это вызовdatetime.fromtimestamp(timestamp, tz=timezone.utc).Изменено в версии 3.3: Вызывает
OverflowErrorвместоValueError, если временная метка выходит за пределы диапазона значений, поддерживаемых платформенной функцией Cgmtime(). ВызываетOSErrorвместоValueErrorприgmtime()сбое.Устарело начиная с версии 3.12: Используйте
datetime.fromtimestamp()сUTCвместо этого.
-
classmethod datetime.fromordinal(ordinal) -
Возвращает
datetime, соответствующий пролептическому григорианскому порядковому номеру, где 1 января года 1 имеет порядковый номер 1.ValueErrorгенерируется, если1 <= ordinal <= datetime.max.toordinal(). Часы, минуты, секунды и микросекунды результата равны 0, аtzinfoNone.
-
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может быть заменён любым одиночным символом Юникода. - Дробные часы и минуты не поддерживаются.
- Даты с уменьшенной точностью в настоящее время не поддерживаются (
YYYY-MM,YYYY). - Расширенные представления дат в настоящее время не поддерживаются (
±YYYYYY-MM-DD). - Порядковые даты в настоящее время не поддерживаются (
YYYY-OOO).
Примеры:
>>> from datetime import datetime >>> datetime.fromisoformat('2011-11-04') datetime.datetime(2011, 11, 4, 0, 0) >>> datetime.fromisoformat('20111104') 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-04T00:05:23Z') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc) >>> datetime.fromisoformat('20111104T000523') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> datetime.fromisoformat('2011-W01-2T00:05:23.283') datetime.datetime(2011, 1, 4, 0, 5, 23, 283000) >>> 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.
Изменено в версии 3.11: Ранее этот метод поддерживал только форматы, которые мог выдать
date.isoformat()илиdatetime.isoformat().
-
classmethod datetime.fromisocalendar(year, week, day) -
Возвращает
datetime, соответствующий дате по ISO-календарю, заданной годом, неделей и днём. Компоненты даты, отличные от даты, заполняются стандартными значениями по умолчанию. Это обратная функция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.13: Если шаблон format определяет день месяца без года, теперь генерируется
DeprecationWarning. Это сделано для устранения ошибки с учётом високосных лет в коде, пытающемся разобрать только месяц и день, так как год по умолчанию в отсутствие года в шаблоне не является високосным. Такие значения format могут вызывать ошибку, начиная с Python 3.15. Решением является всегда включение года в ваш шаблон format. При разборе значений date_string, не содержащих год, добавьте явно високосный год перед разбором:>>> from datetime import datetime >>> date_string = "02/29" >>> when = datetime.strptime(f"{date_string};1984", "%m/%d;%Y") # Avoids leap year bug. >>> when.strftime("%B %d") 'February 29'
Атрибуты класса:
-
datetime.min -
Самый ранний представимый объект
datetime,datetime(MINYEAR, 1, 1, tzinfo=None).
-
datetime.max -
Самый поздний представимый объект
datetime,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None).
-
datetime.resolution -
Наименьшее возможное различие между неравными объектами
datetime,timedelta(microseconds=1).
Атрибуты экземпляра (только для чтения):
-
datetime.month -
От 1 до 12 включительно.
-
datetime.day -
От 1 до количества дней в данном месяце данного года.
-
datetime.hour -
В
range(24).
-
datetime.minute -
В
range(60).
-
datetime.second -
В
range(60).
-
datetime.microsecond -
В
range(1000000).
-
datetime.tzinfo -
Объект, переданный в качестве аргумента tzinfo конструктору
datetime, илиNone, если он не был передан.
-
datetime.fold -
В
[0, 1]. Используется для размыкания временных меток во время повторяющегося интервала. (Повторяющийся интервал возникает, когда часы возвращаются назад в конце летнего времени или когда смещение UTC для текущей зоны уменьшается по политическим причинам.) Значения 0 и 1 соответствуют, соответственно, более раннему и более позднему из двух моментов с одинаковым временным представлением.Добавлена в версии 3.6.
Поддерживаемые операции:
Операция | Результат |
|---|---|
| (1) |
| (2) |
| (3) |
Сравнение на равенство. (4) | |
Сравнение на порядок. (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были сначала преобразованы в наивные 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.date() -
Возвращает объект
dateс тем же годом, месяцем и днём.
-
datetime.time() -
Возвращает объект
timeс тем же часом, минутой, секундой, микросекундой и значением fold.tzinfo—None. См. также методtimetz().Изменено в версии 3.6: Значение fold копируется в возвращаемый объект
time.
-
datetime.timetz() -
Возвращает объект
timeс одинаковыми атрибутами час, минута, секунда, микросекунда, 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 без преобразования данных даты и времени.Объекты
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 # Convert self to UTC, and attach the new timezone object. utc = (self - self.utcoffset()).replace(tzinfo=tz) # Convert from UTC to tz's local time. return tz.fromutc(utc)Изменено в версии 3.3: tz теперь может быть опущено.
Изменено в версии 3.6: Метод
astimezone()теперь может вызываться для неявных экземпляров, которые предполагаются представлять локальное время системы.
-
datetime.utcoffset() -
Если
tzinfoестьNone, возвращаетNone, иначе возвращаетself.tzinfo.utcoffset(self), и вызывает исключение, если последний не возвращаетNoneили объектtimedeltaс величиной меньше одного дня.Изменено в версии 3.7: Смещение по UTC не ограничено целым числом минут.
-
datetime.dst() -
Если
tzinfoестьNone, возвращаетNone, иначе возвращаетself.tzinfo.dst(self), и вызывает исключение, если последний не возвращаетNoneили объектtimedeltaс величиной меньше одного дня.Изменено в версии 3.7: Смещение DST не ограничено целым числом минут.
-
datetime.tzname() -
Если
tzinfoестьNone, возвращаетNone, иначе возвращаетself.tzinfo.tzname(self), вызывает исключение, если последний не возвращаетNoneили строковый объект.
-
datetime.timetuple() -
Возвращает
time.struct_time, такой как возвращаемыйtime.localtime().d.timetuple()эквивалентен:time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, dst))где
yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1— номер дня в текущем году, начиная с 1 для 1 января. Флагtm_isdstрезультата устанавливается в соответствии с методомdst(): еслиtzinfoэтоNoneилиdst()возвращаетNone,tm_isdstустановлено в-1; иначе, еслиdst()возвращает ненулевое значение,tm_isdstустанавливается в 1; иначеtm_isdstустанавливается в 0.
-
datetime.utctimetuple() -
Если экземпляр
datetimedнеявный, это то же самое, что иd.timetuple(), за исключением того, чтоtm_isdstпринудительно устанавливается в 0 независимо от того, что возвращаетd.dst(). 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().Для неявных экземпляров
datetimeпредполагается, что они представляют локальное время, и этот метод полагается на платформенную функцию Cmktime()для выполнения преобразования. Посколькуdatetimeподдерживает более широкий диапазон значений, чемmktime()на многих платформах, этот метод может вызватьOverflowErrorилиOSErrorдля временных моментов, сильно опережающих или отставших от текущего времени.Для явных экземпляров
datetimeвозвращаемое значение вычисляется следующим образом:(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
Добавлена в версии 3.3.
Изменено в версии 3.6: Метод
timestamp()использует атрибутfoldдля устранения неоднозначности во времени во время повторяющегося интервала.Примечание
Нет способа получить временную метку POSIX непосредственно из неявного экземпляра
datetime, представляющего время UTC. Если ваше приложение использует эту конвенцию, а часовой пояс вашего системы не установлен на UTC, вы можете получить временную метку POSIX, предоставивtzinfo=timezone.utc:timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
или рассчитав временную метку напрямую:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
-
datetime.weekday() -
Возвращает день недели как целое число, где понедельник — 0, а воскресенье — 6. То же самое, что и
self.date().weekday(). См. такжеisoweekday().
-
datetime.isoweekday() -
Возвращает день недели как целое число, где понедельник — 1, а воскресенье — 7. То же самое, что и
self.date().isoweekday(). См. такжеweekday(),isocalendar().
-
datetime.isocalendar() -
Возвращает кортеж с тремя компонентами:
year,weekиweekday. То же самое, что иself.date().isocalendar().
-
datetime.isoformat(sep='T', timespec='auto') -
Возвращает строку, представляющую дату и время в формате ISO 8601:
-
YYYY-MM-DDTHH:MM:SS.ffffff, еслиmicrosecondне равно 0 -
YYYY-MM-DDTHH:MM:SS, еслиmicrosecondравно 0
Если
utcoffset()не возвращаетNone, добавляется строка, указывающая смещение от UTC:-
YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], еслиmicrosecondне равно 0 -
YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]], еслиmicrosecondравно 0
Примеры:
>>> from datetime import datetime, timezone >>> datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat() '2019-05-18T15:17:08.132263' >>> datetime(2019, 5, 18, 15, 17, tzinfo=timezone.utc).isoformat() '2019-05-18T15:17:00+00:00'
Необязательный аргумент sep (по умолчанию
'T') — это разделитель из одного символа, помещаемый между частями даты и времени результата. Например:>>> from datetime import tzinfo, timedelta, datetime >>> class TZ(tzinfo): ... """A time zone with an arbitrary, constant -06:39 offset.""" ... def utcoffset(self, dt): ... return timedelta(hours=-6, minutes=-39) ... >>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ') '2002-12-25 00:00:00-06:39' >>> datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat() '2009-11-27T00:00:00.000100-06:39'Необязательный аргумент timespec определяет количество дополнительных компонентов времени для включения (по умолчанию
'auto'). Он может принимать следующие значения:-
'auto': То же, что и'seconds'еслиmicrosecondравно 0, то же, что и'microseconds'в противном случае. -
'hours': Включаетhourв формате с двумя цифрамиHH. -
'minutes': Включаетhourиminuteв форматеHH:MM. -
'seconds': Включаетhour,minuteиsecondв форматеHH:MM:SS. -
'milliseconds': Включает полное время, но обрезает дробную часть секунды до миллисекунд. ФорматHH:MM:SS.sss. -
'microseconds': Включает полное время в форматеHH:MM:SS.ffffff.
Примечание
Исключенные компоненты времени усекаются, а не округляются.
ValueErrorбудет вызван при недопустимом аргументе timespec:>>> from datetime import datetime >>> datetime.now().isoformat(timespec='minutes') '2002-12-25T00:00' >>> dt = datetime(2015, 1, 1, 12, 30, 59, 0) >>> dt.isoformat(timespec='microseconds') '2015-01-01T12:30:59.000000'
Изменено в версии 3.6: Добавлен параметр timespec.
-
-
datetime.__str__() -
Для экземпляра
datetimed,str(d)эквивалентноd.isoformat(' ').
-
datetime.ctime() -
Возвращает строку, представляющую дату и время:
>>> from datetime import datetime >>> datetime(2002, 12, 4, 20, 30, 40).ctime() 'Wed Dec 4 20:30:40 2002'
Выходная строка не будет содержать информацию о часовом поясе, независимо от того, является ли входной параметр явным или неявным.
d.ctime()эквивалентно:time.ctime(time.mktime(d.timetuple()))
на платформах, где функция C
ctime()(которую вызываетtime.ctime(), но не вызываетdatetime.ctime()) соответствует стандарту C.
-
datetime.strftime(format) -
Возвращает строку, представляющую дату и время, управляемую строкой формата. См. также Поведение strftime() и strptime() и
datetime.isoformat().
-
datetime.__format__(format) -
То же, что и
datetime.strftime(). Это позволяет указать строку формата для объектаdatetimeв форматированных строковых литералах и при использованииstr.format(). См. также Поведение strftime() и strptime() иdatetime.isoformat().
Примеры использования: 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.min -
Самое раннее представимое время
time,time(0, 0, 0, 0).
-
time.max -
Самое позднее представимое время
time,time(23, 59, 59, 999999).
-
time.resolution -
Наименьшая возможная разница между двумя различными объектами
time,timedelta(microseconds=1), хотя обратите внимание, что арифметические операции с объектамиtimeне поддерживаются.
Атрибуты экземпляра (только для чтения):
-
time.hour -
В
range(24).
-
time.minute -
В
range(60).
-
time.second -
В
range(60).
-
time.microsecond -
В
range(1000000).
-
time.tzinfo -
Объект, переданный в качестве аргумента tzinfo конструктору
time, илиNoneв случае его отсутствия.
-
time.fold -
В
[0, 1]. Используется для размыкания времен стен по повторяющимся интервалам. (Повторяющийся интервал возникает, когда часы переводятся назад в конце летнего времени или когда смещение UTC для текущей зоны уменьшается по политическим причинам.) Значения 0 и 1 соответственно представляют более ранний и более поздний из двух моментов с одинаковым представлением времени стен.Добавлена в версии 3.6.
Объекты time поддерживают сравнение по равенству и упорядочения, где 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 будет усечено).
- Дробные часы и минуты не поддерживаются.
Примеры:
>>> from datetime import time >>> time.fromisoformat('04:23:01') datetime.time(4, 23, 1) >>> time.fromisoformat('T04:23:01') datetime.time(4, 23, 1) >>> time.fromisoformat('T042301') datetime.time(4, 23, 1) >>> time.fromisoformat('04:23:01.000384') datetime.time(4, 23, 1, 384) >>> 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))) >>> time.fromisoformat('04:23:01Z') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc) >>> time.fromisoformat('04:23:01+00:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)Добавлена в версии 3.7.
Изменено в версии 3.11: Ранее этот метод поддерживал только форматы, которые можно было вывести с помощью
time.isoformat().
Методы экземпляра:
-
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не равен 0 -
HH:MM:SS, еслиmicrosecondравен 0 -
HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], еслиutcoffset()не возвращаетNone -
HH:MM:SS+HH:MM[:SS[.ffffff]], еслиmicrosecondравен 0 иutcoffset()не возвращаетNone
Необязательный аргумент timespec указывает количество дополнительных компонентов времени для включения (по умолчанию
'auto'). Он может быть одним из следующих:-
'auto': То же, что и'seconds'еслиmicrosecondравен 0, то же, что и'microseconds'в противном случае. -
'hours': Включитьhourв формате с двумя цифрамиHH. -
'minutes': Включитьhourиminuteв форматеHH:MM. -
'seconds': Включитьhour,minuteиsecondв форматеHH:MM:SS. -
'milliseconds': Включить полное время, но обрезать дробную часть секунды до миллисекунд. ФорматHH:MM:SS.sss. -
'microseconds': Включить полное время в форматеHH:MM:SS.ffffff.
Примечание
Исключенные компоненты времени усекаются, а не округляются.
ValueErrorбудет поднято при некорректном аргументе timespec.Пример:
>>> from datetime import time >>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes') '12:34' >>> dt = time(hour=12, minute=34, second=56, microsecond=0) >>> dt.isoformat(timespec='microseconds') '12:34:56.000000' >>> dt.isoformat(timespec='auto') '12:34:56'
Изменено в версии 3.6: Добавлен параметр timespec.
-
-
time.__str__() -
Для времени
t,str(t)эквивалентноt.isoformat().
-
time.strftime(format) -
Возвращает строку, представляющую время, управляемую явным строковым форматом. См. также Поведение strftime() и strptime() и
time.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: Смещение по Гринвичу не ограничено целым числом минут.
-
time.dst() -
Если
tzinfoявляетсяNone, возвращаетNone, в противном случае возвращаетself.tzinfo.dst(None), и вызывает исключение, если последнее не возвращаетNone, или объектtimedeltaс величиной меньше одного дня.Изменено в версии 3.7: Смещение по летнему времени не ограничено целым числом минут.
-
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()по умолчанию без проблем. Она достаточно эффективна для обработки часовых поясов с постоянным смещением и часовых поясов, учитывающих стандартное и летнее время, и последнее даже если времена перехода к летнему времени отличаются в разные годы. Примером часового пояса, который стандартная реализация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
# https://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, учитывающем как стандартное, так и летнее время, неизбежно возникают тонкости дважды в год, в моменты перехода к летнему времени. Для наглядности рассмотрим часовой пояс Восточное время США (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 начинается (строка «start»), местные часы перескакивают с 1:59 до 3:00. Временные значения вида 2:MM в этот день не имеют смысла, поэтому astimezone(Eastern) не вернет результат с hour == 2 в день начала DST. Например, при весеннем переходе на летнее время 2016 года мы получаем:
>>> from datetime import datetime, timezone >>> from tzinfo_examples import HOUR, Eastern >>> u0 = datetime(2016, 3, 13, 5, tzinfo=timezone.utc) >>> for i in range(4): ... u = u0 + i*HOUR ... t = u.astimezone(Eastern) ... print(u.time(), 'UTC =', t.time(), t.tzname()) ... 05:00:00 UTC = 00:00:00 EST 06:00:00 UTC = 01:00:00 EST 07:00:00 UTC = 03:00:00 EDT 08:00:00 UTC = 04:00:00 EDT
Когда DST заканчивается (строка «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(экземпляр UTCtimezone).zoneinfoпредоставляет базу данных часовых поясов IANA (также известную как база данных Olson) для Python, и ее использование рекомендуется.
- IANA time zone 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() коды формата
Эти методы принимают коды формата, которые могут использоваться для разбора и форматирования дат:
>>> 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'
Ниже приведён список всех кодов формата, требуемых 1989 C стандартом, и они работают на всех платформах со стандартной C реализацией.
Директива | Значение | Пример | Примечания |
|---|---|---|---|
| День недели в сокращённом названии локального формата. | (1) | |
| День недели в полном названии локального формата. | (1) | |
| День недели в виде десятичного числа, где 0 — воскресенье, 6 — суббота. | 0, 1, …, 6 | |
| Номер дня месяца в виде десятичного числа с заполнением нулями. | 01, 02, …, 31 | (9) |
| Месяц в сокращённом названии локального формата. | (1) | |
| Месяц в полном названии локального формата. | (1) | |
| Месяц в виде десятичного числа с заполнением нулями. | 01, 02, …, 12 | (9) |
| Год без века в виде десятичного числа с заполнением нулями. | 00, 01, …, 99 | (9) |
| Год с веком в виде десятичного числа. | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (2) |
| Часы (24-часовой формат) в виде десятичного числа с заполнением нулями. | 00, 01, …, 23 | (9) |
| Часы (12-часовой формат) в виде десятичного числа с заполнением нулями. | 01, 02, …, 12 | (9) |
| Локальный эквивалент AM или PM. | (1), (3) | |
| Минуты в виде десятичного числа с заполнением нулями. | 00, 01, …, 59 | (9) |
| Секунды в виде десятичного числа с заполнением нулями. | 00, 01, …, 59 | (4), (9) |
| Микросекунды в виде десятичного числа, заполненного нулями до 6 знаков. | 000000, 000001, …, 999999 | (5) |
| Смещение UTC в формате | (пустая), +0000, -0400, +1030, +063415, -030712.345216 | (6) |
| Имя часового пояса (пустая строка, если объект неявный). | (пустая), UTC, GMT | (6) |
| Номер дня года в виде десятичного числа с заполнением нулями. | 001, 002, …, 366 | (9) |
| Номер недели года (воскресенье — первый день недели) в виде десятичного числа с заполнением нулями. Все дни в новом году, предшествующие первому воскресенью, считаются неделей 0. | 00, 01, …, 53 | (7), (9) |
| Номер недели года (понедельник — первый день недели) в виде десятичного числа с заполнением нулями. Все дни в новом году, предшествующие первому понедельнику, считаются неделей 0. | 00, 01, …, 53 | (7), (9) |
| Локальное представление даты и времени. | (1) | |
| Локальное представление даты. | (1) | |
| Локальное представление времени. | (1) | |
| Буквальный символ | % |
Для удобства включены несколько дополнительных директив, не требуемых C89 стандартом. Эти параметры соответствуют значениям даты ISO 8601.
Директива | Значение | Пример | Примечания |
|---|---|---|---|
| Год ISO 8601 с веком, представляющий год, содержащий большую часть ISO недели ( | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (8) |
| День недели ISO 8601 в виде десятичного числа, где 1 — понедельник. | 1, 2, …, 7 | |
| Неделя ISO 8601 в виде десятичного числа с понедельником как первым днём недели. Неделя 01 — неделя, содержащая 4 января. | 01, 02, …, 53 | (8), (9) |
| Смещение UTC в формате | (пустая), +00:00, -04:00, +10:30, +06:34:15, -03:07:12.345216 | (6) |
Эти директивы могут быть недоступны на всех платформах при использовании с методом strftime(). Директивы ISO 8601 года и ISO 8601 недели не взаимозаменяемы с директивами года и номера недели выше. Вызов strptime() с неполными или неоднозначными директивами ISO 8601 приведёт к исключению ValueError.
Полный набор поддерживаемых кодов формата варьируется в зависимости от платформы, так как Python использует функцию платформенной C библиотеки strftime() и платформенные различия распространены. Чтобы узнать полный набор кодов формата, поддерживаемых вашей платформой, обратитесь к документации strftime(3). Также существуют различия в обработке неподдерживаемых спецификаторов формата между платформами.
Добавлена в версии 3.6: %G, %u и %V были добавлены.
Добавлена в версии 3.12: %:z была добавлена.
Технические детали
В общих чертах, d.strftime(fmt) ведет себя как модуль time, хотя не все объекты поддерживают метод timetuple().
Для метода класса datetime.strptime() значение по умолчанию — 1900-01-01T00:00:00.000: любые компоненты, не указанные в строке формата, будут взяты из значения по умолчанию. [4]
Использование datetime.strptime(date_string, format) эквивалентно:
datetime(*(time.strptime(date_string, format)[0:6]))
за исключением случаев, когда формат включает компоненты долей секунды или информацию о смещении часового пояса, которые поддерживаются в datetime.strptime, но отбрасываются time.strptime.
Для объектов time коды формата для года, месяца и дня не должны использоваться, так как объекты time таких значений не имеют. Если они всё же используются, для года подставляется 1900, а для месяца и дня — 1.
По той же причине обработка строк формата, содержащих символы Юникода, которые не могут быть представлены в кодировке текущего региона, также зависит от платформы. На некоторых платформах такие символы сохраняются в выходных данных без изменений, а на других strftime может вызывать UnicodeError или возвращать пустую строку вместо этого.
Примечания:
- Поскольку формат зависит от текущего региона, следует быть осторожными при предположениях о значении выходных данных. Порядок полей будет различаться (например, «месяц/день/год» против «день/месяц/год»), и выходные данные могут содержать символы, отличные от ASCII.
-
Метод
strptime()может анализировать годы в полном диапазоне [1, 9999], но годы < 1000 должны быть заполнены нулями до 4-значного формата.Изменено в версии 3.2: В предыдущих версиях метод
strftime()был ограничен годами >= 1900.Изменено в версии 3.3: В версии 3.2 метод
strftime()был ограничен годами >= 1000. - При использовании с методом
strptime()директива%pвлияет только на выходное поле часа, если для анализа часа используется директива%I. - В отличие от модуля
time, модульdatetimeне поддерживает високочные секунды. - При использовании с методом
strptime()директива%fпринимает от одного до шести цифр и заполняет нулями справа.%fявляется расширением набора символов формата в стандарте C (но реализовано отдельно в объектах datetime и, следовательно, всегда доступно). -
Для объекта без часового пояса коды формата
%z,%:zи%Zзаменяются на пустые строки.Для объекта с часовым поясом:
-
%z -
utcoffset()преобразуется в строку вида±HHMM[SS[.ffffff]], гдеHH— двузначная строка, задающая количество часов смещения UTC,MM— двузначная строка, задающая количество минут смещения UTC,SS— двузначная строка, задающая количество секунд смещения UTC, аffffff— шестизначная строка, задающая количество микросекунд смещения UTC. Частьffffffопускается, если смещение — целое число секунд, а частиffffffиSSопускаются, если смещение — целое число минут. Например, еслиutcoffset()возвращаетtimedelta(hours=-3, minutes=-30),%zзаменяется строкой'-0330'.
Изменено в версии 3.7: Смещение UTC не ограничено целым числом минут.
Изменено в версии 3.7: При использовании директивы
%zс методомstrptime(), смещения UTC могут иметь двоеточие в качестве разделителя между часами, минутами и секундами. Например,'+01:00:00'будет анализироваться как смещение в один час. Кроме того, использование'Z'идентично'+00:00'.-
%:z -
Ведет себя точно так же, как
%z, но добавляет двоеточие в качестве разделителя между часами, минутами и секундами. -
%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используется только в расчетах, когда в строке форматаstrptime()указан день недели и год ISO (%G). Также обратите внимание, что%Gи%Yне взаимозаменяемы. - При использовании с методом
strptime(), ведущий ноль необязателен для форматов%d,%m,%H,%I,%M,%S,%j,%U,%W, и%V. Формат%yтребует ведущего нуля. -
При анализе месяца и дня с помощью
strptime()всегда включайте год в формате. Если у значения, которое необходимо проанализировать, нет года, добавьте явную фиктивную високосный год. В противном случае ваш код вызовет исключение при обнаружении високосного дня, так как год по умолчанию, используемый анализатором, не является високосным. Пользователи сталкиваются с этой ошибкой каждые четыре года…>>> month_day = "02/29" >>> datetime.strptime(f"{month_day};1984", "%m/%d;%Y") # No leap year bug. datetime.datetime(1984, 2, 29, 0, 0)Устарело начиная с версии 3.13, будет удалено в версии 3.15:
strptime()вызовы, использующие строку формата, содержащую день месяца без года, теперь выдают предупреждениеDeprecationWarning. В версии 3.15 или более поздней мы можем изменить это на ошибку или изменить год по умолчанию на високосный год. См. gh-70647.
Примечания
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/datetime.html