datetime
— Основные типы даты и времени¶
Исходный код: Lib/datetime.py
Модуль datetime
предоставляет классы для манипулирования датами и временем.
Хотя поддерживается арифметика даты и времени, основное внимание в реализации уделяется эффективному извлечению атрибутов для форматирования выходных данных и манипулирования ими.
Совет
Перейдите к the format codes.
См.также
- Модуль
calendar
Общие функции, связанные с календарем.
- Модуль
time
Временной доступ и конверсии.
- Модуль
zoneinfo
Конкретные часовые пояса, представляющие базу данных часовых поясов IANA.
- Пакет dateutil
Сторонняя библиотека с расширенным часовым поясом и поддержкой синтаксического анализа.
- Пакет DateType
Сторонняя библиотека, которая вводит различные статические типы, чтобы, например, разрешить static type checkers различать наивные и осознанные даты-времени.
Осознанные и наивные объекты¶
Объекты даты и времени могут быть классифицированы как «осведомленные» или «наивные» в зависимости от того, содержат ли они информацию о часовом поясе.
Обладая достаточными знаниями о применимых алгоритмических и политических настройках времени, таких как информация о часовом поясе и переходе на летнее время, объект, о котором известно, может определить свое местоположение относительно других объектов, о которых известно. Объект, о котором известно, представляет определенный момент времени, который не поддается интерпретации. [1]
Наивный объект не содержит достаточно информации, чтобы однозначно определить его местоположение относительно других объектов даты/времени. Представляет ли наивный объект всемирное координированное время (UTC), местное время или время в каком-либо другом часовом поясе, зависит исключительно от программы, точно так же, как от программы зависит, представляет ли конкретное число метры, мили или массу. Наивные объекты легко понять и с ними легко работать, несмотря на игнорирование некоторых аспектов реальности.
Для приложений, которым требуются объекты с поддержкой, объекты datetime
и time
имеют необязательный атрибут информации о часовом поясе tzinfo
, который может быть присвоен экземпляру подкласса абстрактного класса tzinfo
. Эти объекты tzinfo
содержат информацию о смещении времени от UTC, названии часового пояса и о том, действует ли летнее время.
Только один конкретный класс tzinfo
, класс timezone
, предоставляется модулем datetime
. Класс timezone
может представлять простые часовые пояса с фиксированным смещением от UTC, например, сам UTC или североамериканские часовые пояса EST и EDT. Поддержка часовых поясов на более глубоком уровне детализации зависит от приложения. Правила корректировки времени во всем мире носят скорее политический, чем рациональный характер, часто меняются, и нет единого стандарта, подходящего для каждого применения, кроме UTC.
Константы¶
Модуль datetime
экспортирует следующие константы:
- 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
.
В противном случае, это наивно.
Различие между осознанным и наивным не применимо к объектам 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
Следующий пример иллюстрирует, как любые аргументы, кроме дней, секунд и микросекунд, «объединяются» и нормализуются по этим трем результирующим атрибутам:
>>> 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.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
.
Атрибуты экземпляра (доступны только для чтения):
Атрибут |
Ценность |
---|---|
|
От -9999999999 до 9999999999 включительно |
|
От 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 равно true при условии, что |
В общем, t1 * i == t1 * (i-1) + t1 истинно. (1) |
|
|
Дельта умножается на число с плавающей запятой. Результат округляется до ближайшего значения, кратного значению timedelta.разрешение округляется от половины до четного. |
|
Деление (3) общей продолжительности t2 на единицу интервала t3. Возвращает объект |
|
Дельта делится на число с плавающей точкой или целое число. Результат округляется до ближайшего значения, кратного значению timedelta.resolution, с использованием метода округления от половины до четного. |
|
Вычисляется минимальное значение, а остаток (если таковой имеется) отбрасывается. Во втором случае возвращается целое число. (3) |
|
Остаток вычисляется как объект |
|
Вычисляет частное и остаток: |
|
Возвращает объект |
|
эквивалентно |
|
эквивалентно +*t*, когда |
|
Возвращает строку в виде |
|
Возвращает строковое представление объекта |
Записи:
Это точно, но может привести к переполнению.
Это точно и не может привести к переполнению.
При делении на 0 получается
ZeroDivisionError
.-timedelta.max не может быть представлен как объект
timedelta
.Строковые представления объектов
timedelta
нормализуются аналогично их внутреннему представлению. Это приводит к несколько необычным результатам для отрицательных временных значений. Например:>>> timedelta(hours=-5) datetime.timedelta(days=-1, seconds=68400) >>> print(_) -1 day, 19:00:00
Выражение
t2 - t3
всегда будет равно выражениюt2 + (-t3)
, за исключением случаев, когда t3 равноtimedelta.max
; в этом случае первое приведет к результату, в то время как второе приведет к переполнению.
В дополнение к перечисленным выше операциям, объекты timedelta
поддерживают определенные операции сложения и вычитания с объектами date
и datetime
(см. ниже).
Изменено в версии 3.2: Теперь поддерживается разделение по этажам и истинное разделение объекта timedelta
на другой объект timedelta
, а также операции с остатками и функция divmod()
. Теперь поддерживаются точные операции деления и умножения объекта timedelta
на объект float
.
timedelta
объекты поддерживают сравнение по равенству и порядку.
В логических контекстах объект 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 <= MAXYEAR
1 <= month <= 12
1 <= 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
при ошибке c:func: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¶
Наименьшая возможная разница между неравнозначными объектами данных,
timedelta(days=1)
.
Атрибуты экземпляра (доступны только для чтения):
- date.month¶
От 1 до 12 включительно.
- date.day¶
От 1 до количества дней в данном месяце данного года.
Поддерживаемые операции:
Операция |
Результат |
---|---|
|
дата 2 наступит через |
|
Компьютеры дата 2 такие, что |
|
(3) |
date1 == date2 date1 != date2 |
Сравнение на равенство. (4) |
date1 < date2 date1 > date2 date1 <= date2 date1 >= date2 |
Сравнение заказов. (5) |
Записи:
дата 2 перемещается вперед по времени, если
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, а data2 + timedelta == дата через 1 секунду.
date
объекты равны, если они представляют одну и ту же дату.дата 1 считается меньшей, чем дата 2, тогда дата 1 предшествует дате 2 по времени. Другими словами,
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. Для любого
date
объекта d,date.fromordinal(d.toordinal()) == d
.
- date.weekday()¶
Возвращает день недели в виде целого числа, где понедельник равен 0, а воскресенье равно 6. Например,
date(2002, 12, 4).weekday() == 2
, среда. Смотрите такжеisoweekday()
.
- date.isoweekday()¶
Возвращает день недели в виде целого числа, где понедельник равен 1, а воскресенье - 7. Например,
date(2002, 12, 4).isoweekday() == 3
, среда. Смотрите такжеweekday()
,isocalendar()
.
- date.isocalendar()¶
Возвращает объект named tuple, состоящий из трех компонентов:
year
,week
иweekday
.Календарь ISO - это широко используемый вариант григорианского календаря. [3]
Год ISO состоит из 52 или 53 полных недель, каждая из которых начинается в понедельник и заканчивается в воскресенье. Первая неделя года ISO - это первая (по григорианскому) календарю неделя года, в которую входит четверг. Это называется неделя номер 1, и год по стандарту ISO для этого четверга совпадает с его григорианским годом.
Например, 2004 год начинается в четверг, поэтому первая неделя 2004 года ISO начинается в понедельник, 29 декабря 2003 года, и заканчивается в воскресенье, 4 января 2004 года:
>>> from datetime import date >>> date(2003, 12, 29).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=1) >>> date(2004, 1, 4).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
Изменено в версии 3.9: Результат изменен с кортежа на named tuple.
- date.isoformat()¶
Возвращает строку, представляющую дату в формате ISO 8601,
YYYY-MM-DD
:>>> from datetime import date >>> date(2002, 12, 4).isoformat() '2002-12-04'
- date.__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
в formatted string literals и при использовании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()¶
Возвращает текущую локальную дату и время с помощью
tzinfo
None
.Эквивалентно:
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 с помощью
tzinfo
None
.Это похоже на
now()
, но возвращает текущую дату и время UTC в виде наивного объектаdatetime
. Текущую дату и время UTC можно получить, вызвавdatetime.now(timezone.utc)
. Смотрите такжеnow()
.Предупреждение
Поскольку наивные объекты
datetime
обрабатываются многими методамиdatetime
как местное время, предпочтительнее использовать осведомленные даты для представления времени в UTC. Таким образом, рекомендуемый способ создания объекта, представляющего текущее время в UTC, - это вызовdatetime.now(timezone.utc)
.
- classmethod datetime.fromtimestamp(timestamp, tz=None)¶
Возвращает локальную дату и время, соответствующие временной метке POSIX, такие как
time.time()
. Если необязательный аргумент tz равенNone
или не указан, временная метка преобразуется в локальные дату и время платформы, а возвращаемый объектdatetime
является наивным.Если tz не является
None
, это должен быть экземпляр подклассаtzinfo
, и временная метка преобразуется в часовой пояс tz.fromtimestamp()
может вызватьOverflowError
, если временная метка выходит за пределы диапазона значений, поддерживаемых функциями платформы Clocaltime()
илиgmtime()
, иOSError
вкл.localtime()
илиgmtime()
сбой. Обычно это ограничивается периодом с 1970 по 2038 год. Обратите внимание, что в системах, отличных от POSIX, которые включают високосные секунды в свое понятие временной метки, високосные секунды игнорируютсяfromtimestamp()
, и тогда возможно иметь две временные метки, отличающиеся на секунду, которые дают идентичные объектыdatetime
. Этот метод предпочтительнее, чемutcfromtimestamp()
.Изменено в версии 3.3: Поднимите значение
OverflowError
вместоValueError
, если временная метка выходит за пределы диапазона значений, поддерживаемых функциями платформы Clocaltime()
илиgmtime()
. ПоднимитеOSError
вместоValueError
при ошибке : c:func:localtime илиgmtime()
.Изменено в версии 3.6:
fromtimestamp()
может возвращать экземпляры с значениемfold
равным 1.
- classmethod datetime.utcfromtimestamp(timestamp)¶
Верните значение UTC
datetime
, соответствующее временной метке POSIX, с помощьюtzinfo
None
. (Результирующий объект является наивным).Это может привести к возникновению ошибки
OverflowError
, если временная метка выходит за пределы диапазона значений, поддерживаемых функцией платформы Cgmtime()
, и сбояOSError
наgmtime()
. Обычно это ограничивается периодом с 1970 по 2038 год.Чтобы получить объект с информацией
datetime
, вызовитеfromtimestamp()
:datetime.fromtimestamp(timestamp, timezone.utc)
На платформах, совместимых с POSIX, это эквивалентно следующему выражению:
datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
за исключением того, что последняя формула всегда поддерживает полный диапазон лет: от
MINYEAR
доMAXYEAR
включительно.Предупреждение
Поскольку наивные объекты
datetime
обрабатываются многими методамиdatetime
как местное время, предпочтительнее использовать осведомленные даты для представления времени в UTC. Таким образом, рекомендуемый способ создания объекта, представляющего определенную временную метку в UTC, заключается в вызовеdatetime.fromtimestamp(timestamp, tz=timezone.utc)
.Изменено в версии 3.3: Поднимите значение
OverflowError
вместоValueError
, если временная метка выходит за пределы диапазона значений, поддерживаемых функцией платформы Cgmtime()
. Поднимите значениеOSError
вместоValueError
при ошибке c:func:gmtime.
- classmethod datetime.fromordinal(ordinal)¶
Возвращает
datetime
, соответствующий пролептическому григорианскому порядковому номеру, где 1 января 1-го года имеет порядковый номер 1.ValueError
увеличивается, если только не1 <= ordinal <= datetime.max.toordinal()
. Часы, минуты, секунды и микросекунды результата равны 0, аtzinfo
равноNone
.
- classmethod datetime.combine(date, time, tzinfo=self.tzinfo)¶
Возвращает новый
datetime
объект, компоненты даты которого равны заданномуdate
объекту, а компоненты времени равны заданномуtime
объекту. Если указан аргумент tzinfo, его значение используется для установки атрибутаtzinfo
результата, в противном случае используется атрибутtzinfo
аргумента time.Для любого объекта
datetime
d,d == datetime.combine(d.date(), d.time(), d.tzinfo)
. Если дата является объектомdatetime
, ее временные компоненты и атрибутыtzinfo
игнорируются.Изменено в версии 3.6: Добавлен аргумент tzinfo.
- classmethod datetime.fromisoformat(date_string)¶
Возвращает
datetime
, соответствующий date_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, проанализированный в соответствии с форматом.Если формат не содержит информации о микросекундах или часовом поясе, это эквивалентно:
datetime(*(time.strptime(date_string, format)[0:6]))
ValueError
вызывается, если date_string и format не могут быть проанализированы с помощьюtime.strptime()
или если оно возвращает значение, которое не является временным кортежем. Смотрите также strftime() и strptime() Поведение иdatetime.fromisoformat()
.
Атрибуты класса:
- datetime.max¶
Самый последний представимый
datetime
,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)
.
- datetime.resolution¶
Наименьшая возможная разница между неравными
datetime
объектами,timedelta(microseconds=1)
.
Атрибуты экземпляра (доступны только для чтения):
- datetime.month¶
От 1 до 12 включительно.
- datetime.day¶
От 1 до количества дней в данном месяце данного года.
- datetime.hour¶
В
range(24)
.
- datetime.minute¶
В
range(60)
.
- datetime.second¶
В
range(60)
.
- datetime.microsecond¶
В
range(1000000)
.
- datetime.tzinfo¶
Объект, переданный в качестве аргумента tzinfo конструктору
datetime
илиNone
, если ни один из аргументов не был передан.
- datetime.fold¶
В
[0, 1]
. Используется для устранения неоднозначности времени на стене в течение повторяющегося интервала. (Повторяющийся интервал возникает, когда часы переводятся назад в конце перехода на летнее время или когда смещение UTC для текущей зоны уменьшается по политическим причинам.) Значение 0 (1) представляет собой более ранний (более поздний) из двух моментов с одинаковым представлением времени на стене.Добавлено в версии 3.6.
Поддерживаемые операции:
Операция |
Результат |
---|---|
|
(1) |
|
(2) |
|
(3) |
datetime1 == datetime2 datetime1 != datetime2 |
Сравнение на равенство. (4) |
datetime1 < datetime2 datetime1 > datetime2 datetime1 <= datetime2 datetime1 >= datetime2 |
Сравнение заказов. (5) |
datetime2 - это длительность временного интервала, удаленная от datetime1, перемещающаяся вперед во времени, если
timedelta.days
> 0, или назад, еслиtimedelta.days
< 0. Результат имеет тот же атрибутtzinfo
, что и входное значение datetime, а значение datetime2 - datetime1 == timedelta после.OverflowError
вызывается, если значение datetime2.year будет меньше, чемMINYEAR
, или больше, чемMAXYEAR
. Обратите внимание, что никакие настройки часового пояса не выполняются, даже если вводимые данные являются объектом с поддержкой.Вычисляет значение datetime2 таким образом, что значение datetime2 + timedelta == дата и время 1. Что касается добавления, то результат имеет тот же атрибут
tzinfo
, что и входное значение datetime, и никакие корректировки часового пояса не выполняются, даже если входные данные известны.Вычитание
datetime
изdatetime
определяется только в том случае, если оба операнда являются наивными или если оба они осознают. Если один из них осознает, а другой - наивен, то возникаетTypeError
.Если оба являются наивными или оба осведомлены и имеют один и тот же атрибут
tzinfo
, атрибутыtzinfo
игнорируются, и результатом являетсяtimedelta
объект t такой, чтоdatetime2 + t == datetime1
. В этом случае настройка часового пояса не производится.Если оба знают и имеют разные атрибуты
tzinfo
,a-b
действует так, как если бы a и b были сначала преобразованы в наивное значение даты и времени UTC. Результатом является(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())
, за исключением того, что реализация никогда не переполняется.datetime
объекты равны, если они представляют одну и ту же дату и время с учетом часового пояса.Наивные и осознающие
datetime
объекты никогда не бывают равны.datetime
объекты никогда не бывают равныdate
объектам, которые также не являются экземплярамиdatetime
, даже если они представляют одну и ту же дату.Если оба параметра сравнения известны и имеют один и тот же атрибут
tzinfo
, атрибутыtzinfo
иfold
игнорируются и сравниваются базовые даты. Если оба параметра сравнения известны и имеют разные атрибутыtzinfo
, сравнение выполняется так, как если бы значения параметров сравнения были сначала преобразованы в даты и время UTC, за исключением того, что реализация никогда не приводит к переполнению.datetime
экземпляры в повторяющемся интервале никогда не были равныdatetime
экземплярам в другой часовой пояс.datetime1 считается меньшим, чем datetime2, если datetime1 предшествует datetime2 по времени, принимая во внимание часовой пояс.
При сравнении порядка между наивными и осознанными объектами
datetime
, а также объектомdatetime
и объектомdate
, который также не является экземпляромdatetime
, возникает проблемаTypeError
.Если оба параметра сравнения известны и имеют один и тот же атрибут
tzinfo
, атрибутыtzinfo
иfold
игнорируются и сравниваются базовые даты. Если оба параметра сравнения известны и имеют разные атрибутыtzinfo
, сравнение выполняется так, как если бы значения сравнения были сначала преобразованы в даты и время UTC, за исключением того, что реализация никогда не переполняется.
Изменено в версии 3.3: Сравнение на равенство между осознанными и наивными экземплярами datetime
не приводит к возникновению TypeError
.
Методы экземпляра:
- datetime.time()¶
Возвращает
time
объект с теми же часами, минутами, секундами, микросекундами и кратностью.tzinfo
равноNone
. Смотрите также методtimetz()
.Изменено в версии 3.6: Значение fold копируется в возвращаемый объект
time
.
- datetime.timetz()¶
Возвращает
time
объект с теми же атрибутами hour, minute, second, microsecond, fold и tzinfo. Смотрите также методtime()
.Изменено в версии 3.6: Значение fold копируется в возвращаемый объект
time
.
- datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)¶
Возвращает значение datetime с теми же атрибутами, за исключением того, что этим атрибутам присваиваются новые значения в зависимости от того, какие аргументы ключевого слова указаны. Обратите внимание, что
tzinfo=None
может быть указано для создания простого значения datetime из реального значения datetime без преобразования данных даты и времени.Изменено в версии 3.6: Добавлен параметр fold.
- datetime.astimezone(tz=None)¶
Возвращает
datetime
объект с новымtzinfo
атрибутом tz, изменяя данные о дате и времени таким образом, чтобы в результате было то же время UTC, что и в self, но по местному времени tz.Если указано, tz должен быть экземпляром подкласса
tzinfo
, а его методыutcoffset()
иdst()
не должны возвращатьNone
. Если значение self является наивным, то предполагается, что оно представляет время в системном часовом поясе.При вызове без аргументов (или с
tz=None
) в качестве целевого часового пояса принимается системный локальный часовой пояс. Атрибуту.tzinfo
преобразованного экземпляра datetime будет присвоено значениеtimezone
с именем зоны и смещением, полученными из операционной системы.Если
self.tzinfo
равно tz, тоself.astimezone(tz)
равно self: корректировка данных о дате или времени не выполняется. В противном случае результатом будет местное время в часовом поясе tz, представляющее то же время UTC, что и self: послеastz = dt.astimezone(tz)
,astz - astz.utcoffset()
будут те же данные о дате и времени, что иdt - dt.utcoffset()
.Если вы просто хотите привязать объект часового пояса tz к дате-времени 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
, else возвращаетself.tzinfo.utcoffset(self)
и создает исключение, если последнее не возвращаетNone
илиtimedelta
объект с магнитудой менее одного дня.Изменено в версии 3.7: Смещение по времени UTC не ограничено целым числом минут.
- datetime.dst()¶
Если
tzinfo
равноNone
, возвращаетNone
, else возвращаетself.tzinfo.dst(self)
и создает исключение, если последнее не возвращаетNone
илиtimedelta
объект с магнитудой менее одного дня.Изменено в версии 3.7: Переход на летнее время не ограничен целым числом минут.
- datetime.tzname()¶
Если
tzinfo
равноNone
, возвращаетNone
, else возвращает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
<8>>> задается значение-1
; в противном случае, еслиdst()
возвращает ненулевое значение, дляtm_isdst
задается значение1
; в противном случае задается значениеtm_isdst
до0
.
- datetime.utctimetuple()¶
Если
datetime
экземпляр d является наивным, то это то же самое, что и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.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()¶
Возвращает значение named tuple, состоящее из трех компонентов:
year
,week
иweekday
. То же, что иself.date().isocalendar()
.
- datetime.isoformat(sep='T', timespec='auto')¶
Возвращает строку, представляющую дату и время в формате ISO 8601:
YYYY-MM-DDTHH:MM:SS.ffffff
, еслиmicrosecond
не равно 0YYYY-MM-DDTHH:MM:SS
, еслиmicrosecond
равно 0
Если
utcoffset()
не возвращаетNone
, добавляется строка, указывающая смещение по UTC:YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]
, еслиmicrosecond
не равно 0YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]]
, еслиmicrosecond
равно 0
Примеры:
>>> from datetime import datetime, timezone >>> datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat() '2019-05-18T15:17:08.132263' >>> datetime(2019, 5, 18, 15, 17, tzinfo=timezone.utc).isoformat() '2019-05-18T15:17:00+00:00'
Необязательный аргумент sep (по умолчанию
'T'
) представляет собой односимвольный разделитель, помещаемый между частями результата, содержащими дату и время. Например:>>> from datetime import tzinfo, timedelta, datetime >>> class TZ(tzinfo): ... """A time zone with an arbitrary, constant -06:39 offset.""" ... def utcoffset(self, dt): ... return timedelta(hours=-6, minutes=-39) ... >>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ') '2002-12-25 00:00:00-06:39' >>> datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat() '2009-11-27T00:00:00.000100-06:39'
Необязательный аргумент timespec указывает количество включаемых дополнительных компонентов времени (по умолчанию используется
'auto'
). Это может быть один из следующих параметров:'auto'
: То же, что'seconds'
, еслиmicrosecond
равно 0, то же, что'microseconds'
в противном случае.'hours'
: Укажитеhour
в двузначном форматеHH
.'seconds'
: Включитьhour
,minute
, иsecond
в форматеHH:MM:SS
.'milliseconds'
: Включить полное время, но сократить долю секунды до миллисекунд.HH:MM:SS.sss
формат.'microseconds'
: Укажите полный рабочий день в форматеHH:MM:SS.ffffff
.
Примечание
Исключенные компоненты времени усекаются, а не округляются.
ValueError
будет задан при недопустимом аргументе timespec:>>> from datetime import datetime >>> datetime.now().isoformat(timespec='minutes') '2002-12-25T00:00' >>> dt = datetime(2015, 1, 1, 12, 30, 59, 0) >>> dt.isoformat(timespec='microseconds') '2015-01-01T12:30:59.000000'
Изменено в версии 3.6: Добавлен параметр timespec.
- datetime.ctime()¶
Возвращает строку, представляющую дату и время:
>>> from datetime import datetime >>> datetime(2002, 12, 4, 20, 30, 40).ctime() 'Wed Dec 4 20:30:40 2002'
Выходная строка не будет содержать информацию о часовом поясе, независимо от того, является ли ввод осознанным или наивным.
d.ctime()
эквивалентно:time.ctime(time.mktime(d.timetuple()))
на платформах, где встроенная функция C
ctime()
(которая вызываетtime.ctime()
, но которая не вызываетdatetime.ctime()
) соответствует стандарту C.
- datetime.strftime(format)¶
Возвращает строку, представляющую дату и время, управляемую строкой явного формата. Смотрите также strftime() и strptime() Поведение и
datetime.isoformat()
.
- datetime.__format__(format)¶
Аналогично
datetime.strftime()
. Это позволяет указать строку формата для объектаdatetime
в formatted string literals и при использовании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.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
считался ложным, если он отображал полночь по Гринвичу. Такое поведение считалось непонятным и приводящим к ошибкам и было удалено в 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
не равно 0HH:MM:SS
, еслиmicrosecond
равно 0HH: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
.'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
в formatted string literals и при использованииstr.format()
. См. также strftime() и strptime() Поведение иtime.isoformat()
.
- time.utcoffset()¶
Если
tzinfo
равноNone
, возвращаетNone
, else возвращаетself.tzinfo.utcoffset(None)
и создает исключение, если последнее не возвращаетNone
илиtimedelta
объект с магнитудой менее одного дня.Изменено в версии 3.7: Смещение по времени UTC не ограничено целым числом минут.
- time.dst()¶
Если
tzinfo
равноNone
, возвращаетNone
, else возвращаетself.tzinfo.dst(None)
и создает исключение, если последнее не возвращаетNone
илиtimedelta
объект с магнитудой менее одного дня.Изменено в версии 3.7: Переход на летнее время не ограничен целым числом минут.
- time.tzname()¶
Если
tzinfo
равноNone
, возвращаетNone
, else возвращает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.Особое требование к маринованию: Подкласс
tzinfo
должен иметь метод__init__()
, который может быть вызван без аргументов, в противном случае он может быть маринован, но, возможно, не будет извлечен снова. Это техническое требование, которое в будущем может быть смягчено.Конкретному подклассу
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()
вызывает свой методtzinfo
атрибутовdst()
, чтобы определить, как должен быть установлен флагtm_isdst
, аtzinfo.fromutc()
вызываетdst()
для учета изменений летнего времени при пересечении часовых поясов.Экземпляр tz подкласса
tzinfo
, который моделирует как стандартное, так и дневное время, должен быть согласован в этом смысле:tz.utcoffset(dt) - tz.dst(dt)
должен возвращать один и тот же результат для каждого
datetime
dt с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: Переход на летнее время не ограничен целым числом минут.
- tzinfo.tzname(dt)¶
Возвращает название часового пояса, соответствующее объекту
datetime
dt, в виде строки. Модуль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
уместен, если класс хочет сказать, что объекты time не участвуют в протоколах 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
Когда начинается переход на летнее время (строка «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:ММ и 6:ММ при преобразовании в восточное время время по Гринвичу преобразуется в 1:ММ, но для более раннего времени атрибуту 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
других подклассов с фиксированным смещением неоднозначностей не возникает.3>>> подкласс (например, класс, представляющий только EST (фиксированное смещение -5 часов) или только EDT (фиксированное смещение -4 часа)).
См.также
zoneinfo
Модуль
datetime
имеет базовый классtimezone
(для обработки произвольных фиксированных смещений от UTC) и его атрибутtimezone.utc
(экземпляр часового пояса UTC).
zoneinfo
переносит базу данных часовых поясов IANA (также известную как база данных Olson) на Python, и рекомендуется ее использование.
- IANA timezone database
База данных часовых поясов (часто называемая tz, tzdata или zoneinfo) содержит код и данные, которые отражают историю местного времени для многих репрезентативных мест по всему миру. Он периодически обновляется, чтобы отразить изменения, вносимые политическими органами в границы часовых поясов, смещения UTC и правила перехода на летнее время.
timezone
Объекты¶
Класс timezone
является подклассом tzinfo
, каждый экземпляр которого представляет часовой пояс, определенный фиксированным смещением от UTC.
Объекты этого класса нельзя использовать для представления информации о часовых поясах в местах, где в разные дни года используются разные смещения или где были внесены исторические изменения в гражданское время.
- class datetime.timezone(offset, name=None)¶
Аргумент offset должен быть указан как объект
timedelta
, представляющий разницу между местным временем и UTC. Он должен находиться строго между-timedelta(hours=24)
иtimedelta(hours=24)
, в противном случае значениеValueError
будет увеличено.Аргумент name необязателен. Если он указан, то это должна быть строка, которая будет использоваться в качестве значения, возвращаемого методом
datetime.tzname()
.Добавлено в версии 3.2.
Изменено в версии 3.7: Смещение по времени UTC не ограничено целым числом минут.
- timezone.utcoffset(dt)¶
Возвращает фиксированное значение, указанное при создании экземпляра
timezone
.Аргумент dt игнорируется. Возвращаемое значение
timedelta
равно разнице между местным временем и UTC.Изменено в версии 3.7: Смещение по времени UTC не ограничено целым числом минут.
- timezone.tzname(dt)¶
Возвращает фиксированное значение, указанное при создании экземпляра
timezone
.Если name не указано в конструкторе, имя, возвращаемое параметром
tzname(dt)
, генерируется из значения параметраoffset
следующим образом. Если смещение равноtimedelta(0)
, то имя будет «UTC», в противном случае это строка в форматеUTC±HH:MM
, где ± - знакoffset
, ЧЧ и ММ - две цифры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.
Директива |
Значение |
Пример |
Записи |
---|---|---|---|
|
День недели - сокращенное название региона. |
Вс, Пн, …, Сб (en_US);
Итак, Mo,…, Sa (de_DE)
|
(1) |
|
День недели в качестве полного названия региона. |
Воскресенье, понедельник, …, суббота (en_US);
Воскресенье, понедельник, …, суббота (de_DE)
|
(1) |
|
День недели - десятичное число, где 0 - воскресенье, а 6 - суббота. |
0, 1, …, 6 |
|
|
День месяца в виде десятичного числа, дополненного нулем. |
01, 02, …, 31 |
(9) |
|
Месяц - сокращенное название региона. |
Январь, февраль, …, декабрь (en_US);
Январь, февраль, …, Декабрь (de_DE)
|
(1) |
|
Месяц в качестве полного названия региона. |
Январь, февраль, …, декабрь (en_US);
Январь, февраль, …, декабрь (de_DE)
|
(1) |
|
Месяц в виде десятичного числа, дополненного нулем. |
01, 02, …, 12 |
(9) |
|
Год без столетия в виде десятичного числа, дополненного нулем. |
00, 01, …, 99 |
(9) |
|
Год с веком в качестве десятичного числа. |
0001, 0002, …, 2013, 2014, …, 9998, 9999 |
(2) |
|
Час (24-часовые часы) в виде десятичного числа, дополненного нулем. |
00, 01, …, 23 |
(9) |
|
Час (12-часовые часы) в виде десятичного числа, дополненного нулем. |
01, 02, …, 12 |
(9) |
|
Языковой эквивалент AM или PM. |
УТРА, вечера (en_US);
утра, вечера (de_DE)
|
(1), (3) |
|
Минута - десятичное число, дополненное нулем. |
00, 01, …, 59 |
(9) |
|
Секунда - это десятичное число, дополненное нулем. |
00, 01, …, 59 |
(4), (9) |
|
Микросекунда в виде десятичного числа, дополненного нулем до 6 цифр. |
000000, 000001, …, 999999 |
(5) |
|
Смещение по UTC в виде |
(пустой), +0000, -0400, +1030, +063415, -030712.345216 |
(6) |
|
Название часового пояса (пустая строка, если объект является наивным). |
(пусто), UTC, GMT |
(6) |
|
День года в виде десятичного числа, дополненного нулем. |
001, 002, …, 366 |
(9) |
|
Номер недели в году (воскресенье - первый день недели) в виде десятичного числа, дополненного нулем. Все дни в новом году, предшествующие первому воскресенью, считаются днями недели 0. |
00, 01, …, 53 |
(7), (9) |
|
Номер недели в году (понедельник - первый день недели) в виде десятичного числа, дополненного нулем. Все дни в новом году, предшествующие первому понедельнику, считаются днями недели 0. |
00, 01, …, 53 |
(7), (9) |
|
Соответствующее языковому стандарту представление даты и времени. |
Вт, 16 августа 21:30:00 1988 (en_US);
Di 16 августа 21:30: 00 1988 г. (de_DE)
|
(1) |
|
Соответствующее языковому стандарту представление даты. |
16/08/88 (Нет);
16.08.1988 (en_US);
16.08.1988 (de_DE)
|
(1) |
|
Соответствующее времени представление в локали. |
21:30:00 (en_US);
21:30:00 (de_DE)
|
(1) |
|
Буквальный символ |
% |
Для удобства включены несколько дополнительных указаний, не требуемых стандартом C89. Все эти параметры соответствуют значениям даты по стандарту ISO 8601.
Директива |
Значение |
Пример |
Записи |
---|---|---|---|
|
Год ISO 8601, где столетие обозначает год, на который приходится большая часть недели ISO ( |
0001, 0002, …, 2013, 2014, …, 9998, 9999 |
(8) |
|
ISO 8601 - день недели в виде десятичного числа, где 1 - понедельник. |
1, 2, …, 7 |
|
|
Неделя по стандарту ISO 8601 - это десятичное число, в котором понедельник является первым днем недели. Неделя 01 - это неделя, на которой указано 4 января. |
01, 02, …, 53 |
(8), (9) |
Они могут быть доступны не на всех платформах при использовании метода strftime()
. Директивы ISO 8601 «Год» и ISO 8601 «неделя» не взаимозаменяемы с директивами, указанными выше, «год» и «номер недели». Вызов strptime()
с неполными или неоднозначными директивами ISO 8601 приведет к появлению ValueError
.
Полный набор поддерживаемых кодов форматов различается в зависимости от платформы, поскольку Python вызывает функцию библиотеки платформы C strftime()
, и существуют различные варианты платформы. Чтобы ознакомиться с полным набором кодов форматов, поддерживаемых на вашей платформе, обратитесь к документации strftime(3). Существуют также различия между платформами в обработке неподдерживаемых спецификаторов формата.
Добавлено в версии 3.6: %G
, %u
и были добавлены %V
.
Техническая деталь¶
Вообще говоря, d.strftime(fmt)
действует подобно time
модулю time.strftime(fmt, d.timetuple())
, хотя не все объекты поддерживают метод timetuple()
.
Для метода класса datetime.strptime()
значением по умолчанию является 1900-01-01T00:00:00.000
: все компоненты, не указанные в строке формата, будут извлечены из значения по умолчанию. [4]
Использование datetime.strptime(date_string, format)
эквивалентно:
datetime(*(time.strptime(date_string, format)[0:6]))
за исключением случаев, когда формат содержит субсекундные компоненты или информацию о смещении часового пояса, которые поддерживаются в datetime.strptime
, но отбрасываются в time.strptime
.
Для объектов time
не следует использовать коды формата для года, месяца и дня, так как объекты time
не имеют таких значений. Если они все равно используются, 1900
заменяется на год, а 1
- на месяц и день.
Для объектов date
не следует использовать коды формата часов, минут, секунд и микросекунд, поскольку объекты date
не имеют таких значений. Если они все равно используются, вместо них используется 0
.
По той же причине обработка строк формата, содержащих кодовые точки Unicode, которые не могут быть представлены в кодировке текущего языкового стандарта, также зависит от платформы. На некоторых платформах такие кодовые точки сохраняются в выходных данных без изменений, в то время как на других strftime
может вызывать UnicodeError
или возвращать пустую строку.
Записи:
Поскольку формат зависит от текущего языкового стандарта, следует соблюдать осторожность при выборе значения для вывода. Порядок следования полей может отличаться (например, «месяц/день/год» и «день/месяц/год»), и выходные данные могут содержать символы, отличные от ASCII.
Метод
strptime()
может анализировать годы в полном диапазоне [1, 9999], но годы < 1000 должны быть заполнены нулями до 4-значной ширины.Изменено в версии 3.2: В предыдущих версиях метод
strftime()
был ограничен годами >= 1900.Изменено в версии 3.3: В версии 3.2 метод
strftime()
был ограничен числом лет >= 1000.При использовании с методом
strptime()
директива%p
влияет на выходное поле hour только в том случае, если для анализа часа используется директива%I
.В отличие от модуля
time
, модульdatetime
не поддерживает високосные секунды.При использовании с методом
strptime()
директива%f
принимает от одной до шести цифр и нулевые поля справа.%f
является расширением набора символов формата в стандарте C (но реализована отдельно в объекты datetime и, следовательно, всегда доступны).Для наивного объекта коды формата
%z
и%Z
заменяются пустыми строками.Для осознающего объекта:
%z
utcoffset()
преобразуется в строку вида±HHMM[SS[.ffffff]]
, гдеHH
- двузначная строка, указывающая количество часов смещения UTC,MM
- двузначная строка, указывающая количество минут смещения UTC,SS
- это 2-значная строка, указывающая количество секунд смещения UTC, аffffff
- 6-значная строка, указывающая количество микросекунд смещения UTC. Частьffffff
пропускается, если смещение равно целому числу секунд, а частьffffff
и частьSS
пропускаются, если смещение равно целому числу минут. Например, еслиutcoffset()
возвращает значениеtimedelta(hours=-3, minutes=-30)
,%z
, то оно заменяется строкой'-0330'
.
Изменено в версии 3.7: Смещение по времени UTC не ограничено целым числом минут.
Изменено в версии 3.7: Когда методу
strptime()
предоставляется директива%z
, смещения 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
используется только в расчетах, когда день недели и год по стандарту ISO (%G
) указаны в строке форматаstrptime()
. Также обратите внимание, что%G
и%Y
не являются взаимозаменяемыми.При использовании метода
strptime()
начальный ноль необязателен для форматов%d
,%m
,%H
,%I
,%M
,%S
,%j
,%U
,%W
, и%V
. Для формата%y
требуется начальный ноль.
Сноски