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 обладают следующими общими свойствами:
Определение того, учитывает ли объект часовой пояс
Объекты типа 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.
Атрибуты экземпляра (только для чтения):
Атрибут | Значение |
|---|---|
| От -999999999 до 999999999 включительно |
| От 0 до 86399 включительно |
| От 0 до 999999 включительно |
Поддерживаемые операции:
Операция | Результат |
|---|---|
| Сумма t2 и t3. После этого равенства t1-t2 == t3 и t1-t3 == t2 истинны. (1) |
| Разность t2 и t3. После этого равенства t1 == t2 - t3 и t2 == t1 + t3 истинны. (1)(6) |
| Дельта, умноженная на целое число. После этого равенство t1 // i == t2 истинно при условии |
В общем случае равенство t1 * i == t1 * (i-1) + t1 истинно. (1) | |
| Дельта, умноженная на число с плавающей точкой. Результат округляется до ближайшего значения, кратного timedelta.resolution, с использованием правила округления половинных значений к ближайшему чётному. |
| Деление (3) общей длительности t2 на единицу интервала t3. Возвращает объект |
| Дельта, делённая на число с плавающей точкой или целое число. Результат округляется до ближайшего значения, кратного timedelta.resolution, с использованием правила округления половинных значений к ближайшему чётному. |
| Вычисляется целая часть, а остаток (если он есть) отбрасывается. Во втором случае возвращается целое число. (3) |
| Остаток вычисляется как объект |
| Вычисляет частное и остаток: |
| Возвращает объект |
| эквивалентно |
| эквивалентно +t, если |
| Возвращает строку в форме |
| Возвращает строковое представление объекта |
Примечания:
- Операция выполняется точно, но может привести к переполнению.
- Операция выполняется точно и не может привести к переполнению.
- Деление на 0 вызывает исключение
ZeroDivisionError. - -timedelta.max нельзя представить объектом
timedelta. -
Строковые представления объектов
timedeltaнормализуются аналогично их внутреннему представлению. Из-за этого для отрицательных значений timedelta получаются несколько необычные результаты. Например:>>> timedelta(hours=-5) datetime.timedelta(days=-1, seconds=68400) >>> print(_) -1 day, 19:00:00
- Выражение
t2 - t3всегда будет равно выражениюt2 + (-t3), кроме случая, когда t3 равноtimedelta.max; в этом случае первое выражение даст результат, а второе приведёт к переполнению.
Помимо перечисленных выше операций, объекты timedelta поддерживают некоторые операции сложения и вычитания с объектами date и datetime (см. ниже).
Изменено в версии 3.2: Теперь поддерживаются деление с округлением вниз и истинное деление объекта timedelta на другой объект timedelta, а также операции получения остатка и функция divmod(). Теперь также поддерживаются истинное деление и умножение объекта timedelta на объект float.
Объекты timedelta поддерживают проверки на равенство и сравнения порядка.
В логическом контексте объект 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: Если временная метка выходит за диапазон значений, поддерживаемых платформенной функцией C
localtime(), возбуждается исключениеOverflowErrorвместоValueError. При ошибкеlocaltime()возбуждается исключениеOSErrorвместоValueError.
-
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 -
Наименьшая возможная разница между неравными объектами даты,
timedelta(days=1).
Атрибуты экземпляра (только для чтения):
-
date.month -
Включительно от 1 до 12.
-
date.day -
Включительно от 1 до количества дней в заданном месяце заданного года.
Поддерживаемые операции:
Операция | Результат |
|---|---|
| date2 будет на |
| Вычисляет date2 так, чтобы |
| (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равны, если представляют одну и ту же дату. -
Считается, что date1 меньше date2, если date1 предшествует date2 во времени. Другими словами,
date1 < date2тогда и только тогда, когдаdate1.toordinal() < date2.toordinal().
В логическом контексте все объекты date считаются истинными.
Методы экземпляра:
-
date.replace(year=self.year, month=self.month, day=self.day) -
Возвращает дату с тем же значением, за исключением параметров, для которых указаны новые значения в переданных именованных аргументах.
Пример:
>>> from datetime import date >>> d = date(2002, 12, 31) >>> d.replace(day=26) datetime.date(2002, 12, 26)
-
date.timetuple() -
Возвращает объект
time.struct_time, аналогичный возвращаемому функциейtime.localtime().Значения часов, минут и секунд равны 0, а флаг перехода на летнее время равен -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) -
Возвращает строку, представляющую дату; формат задается явной строкой формата. Для кодов формата, задающих часы, минуты или секунды, будут использоваться нулевые значения. См. также разделы Поведение 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.
-
classmethod datetime.utcnow() -
Возвращает текущие дату и время в UTC с
tzinfoNone.Этот метод аналогичен
now(), но возвращает текущие дату и время в UTC в виде наивного объектаdatetime. Осведомлённый объект datetime для текущего времени в UTC можно получить, вызвавdatetime.now(timezone.utc). См. такжеnow().Предупреждение
Поскольку многие методы
datetimeрассматривают наивные объектыdatetimeкак местное время, для представления времени в UTC предпочтительно использовать осведомлённые объекты datetime. Поэтому рекомендуемый способ создания объекта, представляющего текущее время в UTC, — вызовdatetime.now(timezone.utc).
-
classmethod datetime.fromtimestamp(timestamp, tz=None) -
Возвращает местные дату и время, соответствующие метке времени POSIX, например, возвращаемой
time.time(). Если необязательный аргумент tz равенNoneили не указан, метка времени преобразуется в местные дату и время платформы, а возвращаемый объектdatetimeявляется наивным.Если tz не равен
None, он должен быть экземпляром подклассаtzinfo, а метка времени преобразуется в часовой пояс tz.fromtimestamp()может возбудить исключениеOverflowError, если метка времени выходит за пределы диапазона значений, поддерживаемого функциями Clocaltime()илиgmtime()платформы, иOSErrorпри ошибкеlocaltime()илиgmtime(). Обычно диапазон ограничен годами с 1970 по 2038. Обратите внимание: в системах, отличных от POSIX, в которых секунды координации учитываются в метках времени,fromtimestamp()игнорирует секунды координации, поэтому две метки времени, отличающиеся на секунду, могут соответствовать одинаковым объектамdatetime. Этот метод предпочтительнееutcfromtimestamp().Изменено в версии 3.3: Если метка времени выходит за пределы диапазона значений, поддерживаемого функциями C
localtime()илиgmtime()платформы, возбуждается исключениеOverflowErrorвместоValueError. При ошибкеlocaltime()илиgmtime()возбуждаетсяOSErrorвместоValueError.Изменено в версии 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как местное время, для представления времени в UTC предпочтительно использовать осведомлённые объекты datetime. Поэтому рекомендуемый способ создания объекта, представляющего заданную метку времени в UTC, — вызовdatetime.fromtimestamp(timestamp, tz=timezone.utc).Изменено в версии 3.3: Если метка времени выходит за пределы диапазона значений, поддерживаемого функцией C
gmtime()платформы, возбуждается исключениеOverflowErrorвместоValueError. При ошибкеgmtime()возбуждаетсяOSErrorвместоValueError.
-
classmethod datetime.fromordinal(ordinal) -
Возвращает объект
datetime, соответствующий пролептическому григорианскому порядковому номеру, где 1 января года 1 имеет порядковый номер 1. ИсключениеValueErrorвозбуждается, если1 <= ordinal <= datetime.max.toordinal(). Час, минута, секунда и микросекунда результата равны 0, аtzinfoравенNone.
-
classmethod datetime.combine(date, time, tzinfo=self.tzinfo) -
Возвращает новый объект
datetime, компоненты даты которого совпадают с компонентами указанного объектаdate, а компоненты времени — с компонентами указанного объектаtime. Если указан аргумент tzinfo, его значение используется для установки атрибутаtzinfoрезультата; в противном случае используется атрибутtzinfoаргумента time.Для любого объекта
datetimed,d == datetime.combine(d.date(), d.time(), d.tzinfo). Если date является объектомdatetime, его компоненты времени и атрибутыtzinfoигнорируются.Изменено в версии 3.6: Добавлен аргумент tzinfo.
-
classmethod datetime.fromisoformat(date_string) -
Возвращает объект
datetime, соответствующий строке date_string в любом допустимом формате ISO 8601, за следующими исключениями:- Смещения часовых поясов могут содержать дробные секунды.
- Разделитель
Tможно заменить любым одиночным символом Unicode. - Дробные часы и минуты не поддерживаются.
- Даты с пониженной точностью в настоящее время не поддерживаются (
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, не относящиеся к дате, получают обычные значения по умолчанию. Это обратная функция для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 и формат не удаётся разобрать с помощьюtime.strptime()или если функция возвращает значение, не являющееся кортежем времени. См. также разделы Поведение strftime() и strptime() иdatetime.fromisoformat().
Атрибуты класса:
-
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 — это datetime1 с вычтенной длительностью timedelta: время сдвигается вперёд, если
timedelta.days> 0, или назад, еслиtimedelta.days< 0. Результат имеет тот же атрибутtzinfo, что и входной объект datetime, и после операции datetime2 - datetime1 == timedelta. ИсключениеOverflowErrorвозбуждается, если год datetime2 окажется меньше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никогда не равны. Объектыdatetimeникогда не равны объектамdate, которые не являются также экземплярамиdatetime, даже если они представляют одну и ту же дату.Если оба сравниваемых объекта осведомлённые и имеют одинаковый атрибут
tzinfo, атрибутыtzinfoиfoldигнорируются, а сравниваются базовые объекты datetime. Если оба сравниваемых объекта осведомлённые и имеют разные атрибутыtzinfo, сравнение выполняется так, как если бы сравниваемые объекты сначала были преобразованы в datetime в UTC, за исключением того, что реализация никогда не вызывает переполнение. Экземплярыdatetimeв повторяющемся интервале никогда не равны экземплярамdatetimeв другом часовом поясе. -
datetime1 считается меньше datetime2, если datetime1 предшествует datetime2 во времени с учётом часового пояса.
Сравнение порядка между наивными и осведомлёнными объектами
datetime, а также между объектомdatetimeи объектомdate, который не является также экземпляромdatetime, вызывает исключениеTypeError.Если оба сравниваемых объекта осведомлённые и имеют одинаковый атрибут
tzinfo, атрибутыtzinfoиfoldигнорируются, а сравниваются базовые объекты datetime. Если оба сравниваемых объекта осведомлённые и имеют разные атрибутыtzinfo, сравнение выполняется так, как если бы сравниваемые объекты сначала были преобразованы в datetime в UTC, за исключением того, что реализация никогда не вызывает переполнение.
Изменено в версии 3.3: Сравнение на равенство между осведомлёнными и наивными экземплярами datetime не вызывает исключение TypeError.
Методы экземпляра:
-
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 из осведомлённого, не преобразуя данные даты и времени.Изменено в версии 3.6: Добавлен параметр fold.
-
datetime.astimezone(tz=None) -
Возвращает объект
datetimeс новым атрибутомtzinfotz, корректируя данные даты и времени так, чтобы результат соответствовал тому же времени UTC, что и self, но в местном времени часового пояса tz.Если указан, tz должен быть экземпляром подкласса
tzinfo, а его методыutcoffset()иdst()не должны возвращатьNone. Если self — объект без сведений о часовом поясе, предполагается, что он представляет время в системном часовом поясе.Если вызвать метод без аргументов (или с
tz=None), в качестве целевого часового пояса используется местный часовой пояс системы. Атрибут.tzinfoпреобразованного экземпляра datetime будет установлен в экземплярtimezoneс названием часового пояса и смещением, полученными от ОС.Если
self.tzinfo— это tz,self.astimezone(tz)равно self: данные даты и времени не корректируются. В противном случае результатом будет местное время в часовом поясе tz, соответствующее тому же времени UTC, что и self: послеastz = dt.astimezone(tz),astz - astz.utcoffset()будет иметь те же данные даты и времени, что иdt - dt.utcoffset().Если вам нужно лишь присоединить объект часового пояса tz к объекту datetime dt без корректировки данных даты и времени, используйте
dt.replace(tzinfo=tz). Если вам нужно лишь удалить объект часового пояса из объекта datetime dt с часовым поясом, не преобразуя данные даты и времени, используйтеdt.replace(tzinfo=None).Обратите внимание, что метод
tzinfo.fromutc()по умолчанию можно переопределить в подклассеtzinfo, чтобы изменить результат, возвращаемый методомastimezone(). Если не учитывать случаи ошибок,astimezone()работает следующим образом:def astimezone(self, tz): if self.tzinfo is tz: return self # Convert self to UTC, and attach the new time zone object. utc = (self - self.utcoffset()).replace(tzinfo=tz) # Convert from UTC to tz's local time. return tz.fromutc(utc)Изменено в версии 3.3: Аргумент tz теперь можно не указывать.
Изменено в версии 3.6: Метод
astimezone()теперь можно вызывать для экземпляров без сведений о часовом поясе, которые считаются представляющими местное системное время.
-
datetime.utcoffset() -
Если
tzinfo— этоNone, возвращаетNone, иначе возвращаетself.tzinfo.utcoffset(self)и вызывает исключение, если последний не возвращаетNoneили объектtimedeltaс абсолютным значением меньше суток.Изменено в версии 3.7: Смещение UTC не ограничено целым числом минут.
-
datetime.dst() -
Если
tzinfo— этоNone, возвращаетNone, иначе возвращаетself.tzinfo.dst(self)и вызывает исключение, если последний не возвращаетNoneили объектtimedeltaс абсолютным значением меньше суток.Изменено в версии 3.7: Смещение летнего времени не ограничено целым числом минут.
-
datetime.tzname() -
Если
tzinfo— этоNone, возвращаетNone, иначе возвращаетself.tzinfo.tzname(self)и вызывает исключение, если последний не возвращаетNoneили строковый объект,
-
datetime.timetuple() -
Возвращает объект
time.struct_time, подобный объекту, возвращаемому функциейtime.localtime().d.timetuple()эквивалентно:time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, dst))где
yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1— номер дня в текущем году, начиная с1для 1 января. Флагtm_isdstрезультата устанавливается в соответствии с методомdst(): еслиtzinfoравенNoneилиdst()возвращаетNone, тоtm_isdstустанавливается в-1; иначе, еслиdst()возвращает ненулевое значение,tm_isdstустанавливается в1; в противном случаеtm_isdstустанавливается в0.
-
datetime.utctimetuple() -
Если экземпляр
datetimed не содержит сведений о часовом поясе, этот метод работает так же, какd.timetuple(), за исключением того, чтоtm_isdstпринудительно устанавливается в 0 независимо от того, что возвращаетd.dst(). Для времени UTC летнее время никогда не действует.Если d содержит сведения о часовом поясе, d нормализуется к времени UTC вычитанием
d.utcoffset(), после чего возвращается объектtime.struct_timeдля нормализованного времени.tm_isdstпринудительно устанавливается в 0. Обратите внимание, что может быть вызвано исключениеOverflowError, если значение d.year равноMINYEARилиMAXYEARи при корректировке UTC происходит переход через границу года.Предупреждение
Поскольку многие методы
datetimeрассматривают объектыdatetimeбез сведений о часовом поясе как местное время, для представления времени UTC предпочтительно использовать объекты datetime со сведениями о часовом поясе; поэтому применение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для очень давних или отдалённых в будущем дат.Для экземпляров
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.
Примечание
Исключённые компоненты времени отбрасываются, а не округляются.
При недопустимом аргументе timespec будет вызвано исключение
ValueError:>>> 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, содержащий сведения о часовом поясе Кабула (Афганистан), где до 1945 года использовалось смещение +4 UTC, а затем — +4:30 UTC:
from datetime import timedelta, datetime, tzinfo, timezone
class KabulTz(tzinfo):
# Kabul used +4 until 1945, when they moved to +4:30
UTC_MOVE_DATE = datetime(1944, 12, 31, 20, tzinfo=timezone.utc)
def utcoffset(self, dt):
if dt.year < 1945:
return timedelta(hours=4)
elif (1945, 1, 1, 0, 0) <= dt.timetuple()[:5] < (1945, 1, 1, 0, 30):
# An ambiguous ("imaginary") half-hour range representing
# a 'fold' in time due to the shift from +4 to +4:30.
# If dt falls in the imaginary range, use fold to decide how
# to resolve. See PEP495.
return timedelta(hours=4, minutes=(30 if dt.fold else 0))
else:
return timedelta(hours=4, minutes=30)
def fromutc(self, dt):
# Follow same validations as in datetime.tzinfo
if not isinstance(dt, datetime):
raise TypeError("fromutc() requires a datetime argument")
if dt.tzinfo is not self:
raise ValueError("dt.tzinfo is not self")
# A custom implementation is required for fromutc as
# the input to this function is a datetime with utc values
# but with a tzinfo set to self.
# See datetime.astimezone or fromtimestamp.
if dt.replace(tzinfo=timezone.utc) >= self.UTC_MOVE_DATE:
return dt + timedelta(hours=4, minutes=30)
else:
return dt + timedelta(hours=4)
def dst(self, dt):
# Kabul does not observe daylight saving time.
return timedelta(0)
def tzname(self, dt):
if dt >= self.UTC_MOVE_DATE:
return "+04:30"
return "+04"
Использование KabulTz из примера выше:
>>> tz1 = KabulTz() >>> # Datetime before the change >>> dt1 = datetime(1900, 11, 21, 16, 30, tzinfo=tz1) >>> print(dt1.utcoffset()) 4:00:00 >>> # Datetime after the change >>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=tz1) >>> print(dt2.utcoffset()) 4:30:00 >>> # Convert datetime to another time zone >>> dt3 = dt2.astimezone(timezone.utc) >>> dt3 datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc) >>> dt2 datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz()) >>> dt2 == dt3 True
Объекты time
Объект 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, учитывающего часовой пояс, без преобразования данных времени.Изменено в версии 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.
Примечание
Исключённые компоненты времени усекаются, а не округляются.
Если аргумент timespec недопустим, будет вызвано исключение
ValueError.Пример:
>>> 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: Смещение UTC больше не ограничено целым числом минут.
-
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, название часового пояса и смещение летнего времени, исходя из переданного им объекта даты или времени.Необходимо создать конкретный подкласс и предоставить (как минимум) реализации стандартных методов
tzinfo, необходимые используемым вами методамdatetime. Модульdatetimeпредоставляет классtimezone— простой конкретный подклассtzinfo, представляющий часовые пояса с фиксированным смещением относительно UTC, например сам UTC или североамериканское время EST и EDT.Особое требование для сериализации с помощью pickle: у подкласса
tzinfoдолжен быть метод__init__(), который можно вызвать без аргументов; в противном случае объект можно сериализовать с помощью pickle, но, возможно, нельзя будет десериализовать. Это техническое требование, которое в будущем может быть смягчено.Конкретному подклассу
tzinfoможет потребоваться реализовать следующие методы. Набор необходимых методов зависит от того, как используются осведомлённые объектыdatetime. Если вы сомневаетесь, просто реализуйте их все.
-
tzinfo.utcoffset(dt) -
Возвращает смещение местного времени относительно UTC в виде объекта
timedelta. Смещение положительно к востоку от UTC. Если местное время находится к западу от UTC, смещение должно быть отрицательным.Это полное смещение относительно UTC; например, если объект
tzinfoучитывает и часовой пояс, и поправки на летнее время,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, если сведения о летнем времени неизвестны.Если летнее время не действует, верните
timedelta(0). Если летнее время действует, верните поправку в виде объектаtimedelta(подробности см. в описанииutcoffset()). Обратите внимание: если применимо, поправка на летнее время уже добавлена к смещению относительно UTC, возвращаемомуutcoffset(), поэтому обращаться кdst()не нужно, если только вам не требуется получить сведения о летнем времени отдельно. Например,datetime.timetuple()вызывает методdst()атрибутаtzinfo, чтобы определить, как следует установить флагtm_isdst, аtzinfo.fromutc()вызываетdst(), чтобы учесть переходы на летнее время и обратно при пересечении часовых поясов.Экземпляр tz подкласса
tzinfo, моделирующего стандартное и летнее время, должен быть согласованным в следующем смысле:tz.utcoffset(dt) - tz.dst(dt)должен возвращать один и тот же результат для любого объекта
datetimedt, для которогоdt.tzinfo == tz. Для корректных подклассовtzinfoэто выражение возвращает «стандартное смещение» часового пояса, которое должно зависеть только от географического положения, а не от даты или времени. Реализацияdatetime.astimezone()полагается на это, но не может обнаружить нарушения; за соблюдение этого условия отвечает программист. Если подклассtzinfoне может гарантировать это условие, для корректной работы сastimezone()он может переопределить стандартную реализациюtzinfo.fromutc().Большинство реализаций
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: Поправка на летнее время больше не ограничена целым числом минут.
-
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()работает примерно так: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
При начале летнего времени (строка «start») местные часы перескакивают с 1:59 на 3:00. В этот день местное время вида 2:MM не имеет смысла, поэтому astimezone(Eastern) не вернёт результат с hour == 2 в день начала летнего времени. Например, при переходе на летнее время весной 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
При окончании летнего времени (строка «end») возникает, возможно, ещё более серьёзная проблема: есть час, который невозможно однозначно записать в местном времени, — последний час летнего времени. Для восточного времени это время вида 5:MM UTC в день окончания летнего времени. Местные часы снова перескакивают с 1:59 (летнее время) назад на 1:00 (стандартное время). Местное время вида 1:MM неоднозначно. Метод astimezone() имитирует поведение местных часов, отображая в этот момент два соседних часа UTC в один и тот же местный час. В примере с восточным временем время UTC вида 5:MM и 6:MM при преобразовании в восточное время отображается как 1:MM, однако у более раннего времени атрибут fold равен 0, а у более позднего — 1. Например, при переходе обратно на стандартное время осенью 2016 года получаем:
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc) >>> for i in range(4): ... u = u0 + i*HOUR ... t = u.astimezone(Eastern) ... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold) ... 04:00:00 UTC = 00:00:00 EDT 0 05:00:00 UTC = 01:00:00 EDT 0 06:00:00 UTC = 01:00:00 EST 1 07:00:00 UTC = 02:00:00 EST 0
Обратите внимание: экземпляры datetime, различающиеся только значением атрибута fold, считаются равными при сравнении.
Приложения, для которых недопустима неоднозначность местного времени, должны явно проверять значение атрибута fold или избегать использования гибридных подклассов tzinfo; неоднозначности отсутствуют при использовании timezone или любого другого подкласса tzinfo с фиксированным смещением (например, класса, представляющего только EST с фиксированным смещением -5 часов или только EDT с фиксированным смещением -4 часа).
См. также
-
zoneinfo -
Модуль
datetimeсодержит базовый классtimezone(для работы с произвольными фиксированными смещениями относительно UTC) и его атрибутtimezone.utc(экземпляр часового пояса UTC).zoneinfoдобавляет в Python базу часовых поясов IANA (также известную как база Olson); рекомендуется использовать именно её.
- База часовых поясов IANA
-
База часовых поясов (часто называемая 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'
Ниже приведен список всех кодов формата, предусмотренных стандартом C 1989 года; они работают на всех платформах со стандартной реализацией C.
Директива | Значение | Пример | Примечания |
|---|---|---|---|
| Сокращенное название дня недели в соответствии с локалью. | (1) | |
| Полное название дня недели в соответствии с локалью. | (1) | |
| День недели в виде десятичного числа, где 0 — воскресенье, а 6 — суббота. | 0, 1, …, 6 | |
| День месяца в виде десятичного числа с ведущим нулем. | 01, 02, …, 31 | (9) |
| Сокращенное название месяца в соответствии с локалью. | (1) | |
| Полное название месяца в соответствии с локалью. | (1) | |
| Месяц в виде десятичного числа с ведущим нулем. | 01, 02, …, 12 | (9) |
| Год без указания столетия в виде десятичного числа с ведущим нулем. | 00, 01, …, 99 | (9) |
| Год с указанием столетия в виде десятичного числа. | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (2) |
| Час (24-часовой формат) в виде десятичного числа с ведущим нулем. | 00, 01, …, 23 | (9) |
| Час (12-часовой формат) в виде десятичного числа с ведущим нулем. | 01, 02, …, 12 | (9) |
| Соответствующее локали обозначение AM или PM. | (1), (3) | |
| Минута в виде десятичного числа с ведущим нулем. | 00, 01, …, 59 | (9) |
| Секунда в виде десятичного числа с ведущим нулем. | 00, 01, …, 59 | (4), (9) |
| Микросекунда в виде десятичного числа с дополнением нулями до 6 цифр. | 000000, 000001, …, 999999 | (5) |
| Смещение относительно UTC в формате | (пустая строка), +0000, -0400, +1030, +063415, -030712.345216 | (6) |
| Название часового пояса (пустая строка, если объект не содержит информации о часовом поясе). | (пустая строка), UTC, GMT | (6) |
| День года в виде десятичного числа с ведущими нулями. | 001, 002, …, 366 | (9) |
| Номер недели года (воскресенье считается первым днем недели) в виде десятичного числа с ведущим нулем. Все дни нового года до первого воскресенья считаются относящимися к неделе 0. | 00, 01, …, 53 | (7), (9) |
| Номер недели года (понедельник считается первым днем недели) в виде десятичного числа с ведущим нулем. Все дни нового года до первого понедельника считаются относящимися к неделе 0. | 00, 01, …, 53 | (7), (9) |
| Представление даты и времени, соответствующее локали. | (1) | |
| Представление даты, соответствующее локали. | (1) | |
| Представление времени, соответствующее локали. | (1) | |
| Символ | % |
Для удобства добавлено несколько дополнительных директив, не предусмотренных стандартом C89. Все эти параметры соответствуют значениям даты ISO 8601.
Директива | Значение | Пример | Примечания |
|---|---|---|---|
| Год ISO 8601 с указанием столетия, к которому относится большая часть недели ISO ( | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (8) |
| День недели ISO 8601 в виде десятичного числа, где 1 — понедельник. | 1, 2, …, 7 | |
| Неделя ISO 8601 в виде десятичного числа, где понедельник считается первым днем недели. Неделя 01 — это неделя, содержащая 4 января. | 01, 02, …, 53 | (8), (9) |
При использовании с методом strftime() эти директивы могут быть доступны не на всех платформах. Директивы года и недели ISO 8601 нельзя взаимозаменять с приведенными выше директивами года и номера недели. Вызов strptime() с неполными или неоднозначными директивами ISO 8601 приведет к возникновению исключения ValueError.
Полный набор поддерживаемых кодов формата зависит от платформы, поскольку Python вызывает функцию strftime() из библиотеки C платформы, а различия между платформами встречаются часто. Полный список кодов формата, поддерживаемых на вашей платформе, можно найти в документации strftime(3). Обработка неподдерживаемых спецификаторов формата также различается на разных платформах.
Добавлено в версии 3.6: Добавлены %G, %u и %V.
Технические подробности
В общих чертах d.strftime(fmt) работает так же, как time.strftime(fmt, d.timetuple()) модуля time, хотя не все объекты поддерживают метод timetuple().
Для метода класса datetime.strptime() значением по умолчанию является 1900-01-01T00:00:00.000: все компоненты, не указанные в строке формата, берутся из значения по умолчанию. [4]
Использование datetime.strptime(date_string, format) эквивалентно следующему:
datetime(*(time.strptime(date_string, format)[0:6]))
за исключением случаев, когда формат включает компоненты долей секунды или информацию о смещении часового пояса: они поддерживаются в datetime.strptime, но отбрасываются time.strptime.
Для объектов time не следует использовать коды формата года, месяца и дня, поскольку у объектов time нет таких значений. Если их все же использовать, вместо года подставляется 1900, а вместо месяца и дня — 1.
Для объектов date не следует использовать коды формата часов, минут, секунд и микросекунд, поскольку у объектов date нет таких значений. Если их все же использовать, вместо них подставляется 0.
По той же причине обработка строк формата, содержащих кодовые точки Unicode, которые не могут быть представлены в кодировке текущей локали, также зависит от платформы. На некоторых платформах такие кодовые точки сохраняются в выходных данных без изменений, тогда как на других strftime может вызвать исключение UnicodeError или вернуть пустую строку.
Примечания:
- Поскольку формат зависит от текущей локали, следует с осторожностью делать предположения о выходном значении. Порядок полей может различаться (например, «месяц/день/год» и «день/месяц/год»), а результат может содержать символы, отличные от 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 -
utcoffset()преобразуется в строку формата±HHMM[SS[.ffffff]], гдеHH— двухзначная строка, указывающая количество часов смещения относительно UTC,MM— двухзначная строка, указывающая количество минут смещения относительно UTC,SS— двухзначная строка, указывающая количество секунд смещения относительно UTC, аffffff— шестизначная строка, указывающая количество микросекунд смещения относительно UTC. Частьffffffопускается, если смещение составляет целое число секунд; частиffffffиSSопускаются, если смещение составляет целое число минут. Например, еслиutcoffset()возвращаетtimedelta(hours=-3, minutes=-30), вместо%zподставляется строка'-0330'.
Изменено в версии 3.7: Смещение относительно UTC не ограничивается целым числом минут.
Изменено в версии 3.7: Если директива
%zпередана методуstrptime(), смещение относительно UTC может содержать двоеточие в качестве разделителя часов, минут и секунд. Например,'+01:00:00'будет разобрано как смещение в один час. Кроме того, передача'Z'эквивалентна передаче'+00:00'.-
%Z -
В методе
strftime()вместо%Zподставляется пустая строка, еслиtzname()возвращаетNone; в противном случае вместо%Zподставляется возвращенное значение, которое должно быть строкой.Метод
strptime()принимает для%Zтолько определенные значения:- любое значение из
time.tznameдля локали вашей системы - предопределенные значения
UTCиGMT
Например, для жителя Японии допустимыми значениями могут быть
JST,UTCиGMT, но, вероятно, неEST. Для недопустимых значений будет вызвано исключениеValueError. - любое значение из
Изменено в версии 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требует ведущего нуля.
Сноски
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/datetime.html