datetime — Базовые типы для представления даты и времени¶
Исходный код: Lib/datetime.py
Модуль datetime предоставляет классы для управления датами и временем.
В то время как поддерживается арифметика даты и времени, основное внимание в реализации уделяется эффективному извлечению атрибутов для форматирования и манипулирования выводом.
См.также
Знающие и наивные объекты¶
Объекты даты и времени можно разделить на «знающие» или «наивные» в зависимости от того, включают ли они информацию о часовом поясе или нет.
С достаточным знанием применимых алгоритмических и политических корректировок времени, таких как часовой пояс и информация о летнем времени, знающий объект может локализовываться относительно других знающих объектов. Знающий объект представляет определенный момент времени, который не открыт для интерпретации. [1]
Объект наивный не содержит достаточной информации, чтобы однозначно локализовать себя относительно других объектов даты/времени. Независимо от того, представляет ли наивный объект скоординированное универсальное время (UTC), локальное время или время в каком-либо другом часовом поясе, программа зависит от того, соответствует ли определенное число метрам, милям или массе. Наивные объекты легко понять и работать с ними, ценой игнорирования некоторых аспектов реальности.
Для приложений, которым требуются знающие объекты, объекты datetime и
time имеют дополнительный атрибут информации о часовом поясе tzinfo,
который может быть установлен в сущность подкласса абстрактного класса
tzinfo. Сущности tzinfo захватывают информации о смещении с
временем UTC, названия часового пояса, и является ли летнее время в
действительности.
Только один конкретный класс tzinfo, класс timezone, поддерживается
модулем datetime. Класс timezone может представлять простые часовые пояса
с фиксированными смещениями от UTC, такие как сам UTC или североамериканские
часовые пояса EST и EDT. Поддержка часовых поясов на более глубоких уровнях
детализации зависит от приложения. Правила корректировки времени во всем мире
являются более политическими, чем рациональными, часто изменяются, и нет
стандарта, подходящего для каждого приложения, кроме UTC.
Доступные типы¶
-
class
datetime.date Идеализированная наивная дата, предполагая, что нынешний григорианский календарь всегда был, и всегда будет, по сути. Атрибуты:
year,monthиday.
-
class
datetime.time Идеализированное время, независимо от конкретного дня, при условии, что каждый день имеет ровно 24* 60* 60 секунд. (Здесь нет понятия «високосные секунды».) Атрибуты:
hour,minute,second,microsecondиtzinfo.
-
class
datetime.datetime Сочетание даты и времени. Атрибуты:
year,month,day,hour,minute,second,microsecondиtzinfo.
-
class
datetime.timedelta Длительность, выражающая разницу между двумя
date,timeилиdatetimeсущности с микросекундным разрешением.
-
class
datetime.tzinfo Абстрактный базовый класс для информационных объектов часового пояса. Он используется
datetimeи классамиtime, чтобы обеспечить настраиваемое понятие корректировки времени (например, составлять часового пояса и/или летнее время).
-
class
datetime.timezone Класс, который осуществляет абстрактный базовый класс
tzinfoкак фиксированное смещение от UTC.Добавлено в версии 3.2.
Объекты этих типов неизменны.
Отношения подкласса:
object
timedelta
tzinfo
timezone
time
date
datetime
Общие свойства¶
Типы date, datetime, time и timezone содержат
следующие общие функции:
- Объекты этих типов неизменяемы.
- Объекты этих типов хэшируемы, означая, что они могут быть используемый как ключами словаря.
- Объекты этих типов поддерживают эффективный пиклинг через модуль
pickle.
Определение того, является ли объект знающим или наивным¶
Объекты типа date всегда наивны.
Объект типа time или datetime может быть знающим или наивным.
Объект datetime d знающий, если выполняются оба из следующих утверждений:
d.tzinfoне являетсяNoned.tzinfo.utcoffset(d)не возвращаетNone
Иначе d наивен.
Объект time t знающий, если выполняются оба из следующих утвержений:
t.tzinfoне являетсяNonet.tzinfo.utcoffset(None)не возвращаетNone.
Иначе t наивен.
Различие между знающими и наивными не относится к timedelta объектам.
Объекты timedelta¶
Объект timedelta представляет длительность, разницу между двумя датами или
временем.
-
class
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)¶ Все аргументы являются необязательными, а по умолчанию -
0. Аргументы могут быть целыми или плавающими и могут быть положительными или отрицательными.Внутри системы хранятся только days, seconds и microseconds. Аргументы преобразуются в эти единицы измерения:
- Миллисекунда преобразуется в 1000 микросекунд.
- Минута преобразуется в 60 секунд.
- Час преобразуется в 3600 секунд.
- Неделя преобразуется в 7 дней.
и дни, секунды и микросекунды затем нормализуются так, чтобы представление было уникальным, с
0 <= microseconds < 10000000 <= seconds < 3600*24(количество секунд за один день)-999999999 <= days <= 999999999
В следующем примере показано, как любые аргументы, кроме days, seconds и microseconds, объединяются и нормализуются в эти три результирующих атрибута:
>>> from datetime import timedelta >>> delta = timedelta( ... days=50, ... seconds=27, ... microseconds=10, ... milliseconds=29000, ... minutes=5, ... hours=8, ... weeks=2 ... ) >>> # Остались только дни, секунды и микросекунды >>> 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.
Атрибуты экземпляра (только для чтения):
| Атрибут | Значение |
|---|---|
days |
От -999999999 до 999999999 включительно |
seconds |
От 0 до 86399 включительно |
microseconds |
От 0 до 999999 включительно |
Поддерживаемые операции:
| Операция | Результат |
|---|---|
t1 = t2 + t3 |
|
t1 = t2 - t3 |
Разность t2 и t3. После этого t1 == t2 - t3 и t2 == t1 + t3 являются true. (1)(6) |
t1 = t2 * i or t1 = i * t2 |
Дельта, умноженная на целое число.
Впоследствии t1 // i == t2 является true,
представленное i != 0. |
| В общем, t1 * i == t1 * (i-1) + t1 является true. (1) | |
t1 = t2 * f or t1 = f * t2 |
Дельта, умноженная на число с плавающей точкой. Результат округляется до ближайшего кратного timedelta.resolution с использованием округления наполовину к четному. |
f = t2 / t3 |
Деление (3) общей длительности t2 на единицу
интервала t3. Возвращает объект
float. |
t1 = t2 / f or t1 = t2 / i |
Дельта делится на число с float или int. Результат округляется до ближайшего кратного timedelta.resolution с использованием округления от половины до четности. |
t1 = t2 // i или
t1 = t2 // t3 |
Целочисленное деление, а остаток (если есть) выбрасывается. Во втором случае возвращается целое число. (3) |
t1 = t2 % t3 |
Остаток рассчитывается как
timedelta объект. (3) |
q, r = divmod(t1, t2) |
Вычисляет частное и остальное:
q = t1 // t2 (3) и r = t1 % t2. q
является целым числом, а r timedelta
объект. |
+t1 |
Возвращает timedelta объект с
некоторым значением. (2) |
-t1 |
Экавивалент
timedelta(-t1.days,
-t1.seconds, -t1.microseconds),
и t1* -1. (1)(4) |
abs(t) |
Эквивалентно +t при t.days >= 0 и
-t когда t.days < 0. (2) |
str(t) |
Возвращает строку в форме
[D day[s], ][H]H:MM:SS[.UUUUUU], где D
является отрицательным для
отрицательных t. (5) |
repr(t) |
Возвращает строковое представление объекта
timedelta как требование конструктора
с каноническим атрибутом значения. |
Примечания:
Это точно, но может быть переполнено.
Это точно и не может быть переполнено.
Деление на 0 поднимает
ZeroDivisionError.-timedelta.max не представляется как объект
timedelta.Строковые представления объектов
timedeltaнормализуются аналогично их внутреннему представлению. Это приводит к несколько необычным результатам для отрицательных таймдельт. Например:>>> timedelta(hours=-5) datetime.timedelta(days=-1, seconds=68400) >>> print(_) -1 day, 19:00:00
Выражение
t2 - t3всегда будет равно выражениюt2 + (-t3), за исключением случаев, когда t3 равноtimedelta.max; в этом случае первое будет давать результат, а второе будет переполняться.
В дополнение к перечисленным выше операциям, объекты timedelta поддерживают
некоторые добавления и вычитания с объектами date и datetime (см.
ниже).
Изменено в версии 3.2: Теперь поддерживается целочисленное деление и истинное деление объекта timedelta
другим объектом timedelta, а также операции остатка и функция divmod().
Теперь поддерживается истинное деление и умножение объекта timedelta на объект
float.
Сравнение timedelta объектов поддерживается с некоторыми оговорками.
Сравнения == или != всегда возвращают bool,
независимо от типа сравниваемого объекта:
>>> from datetime import timedelta
>>> delta1 = timedelta(seconds=57)
>>> delta2 = timedelta(hours=25, seconds=2)
>>> delta2 != delta1
True
>>> delta2 == 5
False
Для всех других сравнений (таких как < и >), когда объект
timedelta сравнивается с объектом другого типа, поднимается TypeError:
>>> delta2 > delta1
True
>>> delta2 > 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'datetime.timedelta' and 'int'
В логических контекстах объект timedelta считается истинным тогда и только
тогда, когда он не равен timedelta(0).
Методы сущности:
-
timedelta.total_seconds()¶ Возвращает общее количество секунд, содержащихся в длительности. Эквивалентно
td / timedelta(seconds=1). Для единиц интервала, отличных от секунд, используйте форму деления непосредственно (например,td / timedelta(microseconds=1)).Обратите внимание, что для очень больших временных интервалов (более 270 лет на большинстве платформ) этот метод потеряет микросекундную точность.
Добавлено в версии 3.2.
Примеры использования: timedelta¶
Дополнительный пример нормализации:
>>> # Компоненты another_year складываются ровно в 365 дней
>>> 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 <= количество дней в данном месяце и году
Если аргумент вне предоставленных диапазонов, поднимается
ValueError.
Другие конструкторы, все методы класса:
-
classmethod
date.today()¶ Возврат текущей локальной даты.
Это эквивалентно
date.fromtimestamp(time.time()).
-
classmethod
date.fromtimestamp(timestamp)¶ Возвращает локальную дату, соответствующую временной метке POSIX, например, возвращаемую
time.time().Он может поднять
OverflowError, если метка времени вне диапазона значения, поддержанного функцией платформы Clocaltime()иOSErrorпри неудачеlocaltime(). Обычно это ограничивается годами с 1970 по 2038. Обратите внимание, что в системах без POSIX, которые включают високосные секунды в понятие временной метки, високосные секунды игнорируютсяfromtimestamp().Изменено в версии 3.3: Поднимается
OverflowErrorвместоValueError, если метка времени вне диапазона значения, поддержанного функцией платформы Clocaltime(). ПоднимаетсяOSErrorвместоValueErrorна сбойlocaltime().
-
classmethod
date.fromordinal(ordinal)¶ Возвращает дату, соответствующую пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1.
ValueErrorподнимается, если не1 <= ordinal <= date.max.toordinal(). Для любой даты d,date.fromordinal(d.toordinal()) == d.
-
classmethod
date.fromisoformat(date_string)¶ Возвращает
date, соответствующий date_string, заданному в форматеYYYY-MM-DD:>>> from datetime import date >>> date.fromisoformat('2019-12-04') datetime.date(2019, 12, 4)
Это обратная сторона
date.isoformat(). Он поддерживает только форматYYYY-MM-DD.Добавлено в версии 3.7.
-
classmethod
date.fromisocalendar(year, week, day)¶ Возвращает
date, соответствующий дате календаря ISO, указанной по году, неделе и дню. Это инверсия функцииdate.isocalendar().Добавлено в версии 3.8.
Атрибуты класса:
-
date.min¶ Самая ранняя представимая дата,
date(MINYEAR, 1, 1).
-
date.max¶ Последняя представляемая дата,
date(MAXYEAR, 12, 31).
-
date.resolution¶ Наименьшая возможная разница между несравненными объектами даты,
timedelta(days=1).
Экземпляр атрибуты (только для чтения):
-
date.month¶ От 1 до 12 включительно.
-
date.day¶ От 1 до числа дней в данном месяце данного года.
Поддерживаемые операции:
| Операция | Результат |
|---|---|
date2 = date1 + timedelta |
date2 - это timedelta.days дней,
удаленных от date1. (1) |
date2 = date1 - timedelta |
Вычисляет date2 так, что date2 +
timedelta == date1. (2) |
timedelta = date1 - date2 |
(3) |
date1 < date2 |
date1 считается меньше date2, когда date1 предшествует date2 во времени.(4) |
Примечания:
- date2 перемещается вперед во времени, если
timedelta.days > 0, или назад, еслиtimedelta.days < 0. Позжеdate2 - date1 == timedelta.days.timedelta.secondsиtimedelta.microsecondsигнорируются.OverflowErrorподнимается, еслиdate2.yearбудет меньшеMINYEARили большеMAXYEAR. timedelta.secondsиtimedelta.microsecondsигнорируются.- Это точно и не может переполняться. timedelta.seconds и timedelta.microseconds равны 0, а dat2 + timedelta = = date1 после.
- Другими словами,
date1 < date2тогда и только тогда, когдаdate1.toordinal() < date2.toordinal(). Сравнение дат вызываетTypeError, если другое сравнение также не является объектомdate. Однако вместо этого возвращается значениеNotImplemented, если другое сравнение имеет значениеtimetuple()атрибут. Этот хук дает возможность другим видам объектов даты реализовать сравнение смешанного типа. Если нет, то при сравнении объектаdateс объектом другого типа возникает объектTypeError, если сравнение не является==или!=. Последние случаи возвращаютFalseилиTrueсоответственно.
В логических контекстах все объекты date считаются True.
Методы сущности:
-
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()¶ Возвращает 3-кортеж (год ISO, номер недели ISO, день недели ISO).
Календарь ISO является широко используемый вариантом григорианского календаря. [3]
Год ISO состоит из 52 или 53 полных недель, и где неделя начинается в понедельника и заканчивается в воскресенье. Первая неделя года ISO является первой (григорианской) календарной неделей года, содержащей четверг. Это называется неделя номер 1, и год ISO этого четверга совпадает с григорианским годом.
Например, 2004 год начинается в четверг, поэтому первая неделя 2004 года ISO начинается в понедельник, 29 декабря 2003 года, и заканчивается в воскресенье, 4 января 2004 года:
>>> from datetime import date >>> date(2003, 12, 29).isocalendar() (2004, 1, 1) >>> date(2004, 1, 4).isocalendar() (2004, 1, 7)
-
date.isoformat()¶ Возвращает строку, представляющей дату в формате ISO 8601,
YYYY-MM-DD:>>> from datetime import date >>> date(2002, 12, 4).isoformat() '2002-12-04'
Это обратная сторона
date.fromisoformat().
-
date.__str__()¶ Для даты d
str(d)эквивалентноd.isoformat().
-
date.ctime()¶ Возвращает строку, представляющую дату:
>>> from datetime import date >>> date(2002, 12, 4).ctime() 'Wed Dec 4 00:00:00 2002'
d.ctime()эквивалентно:time.ctime(time.mktime(d.timetuple()))
на платформах, где родная функция
ctime()(которыйtime.ctime()вызывает, но который не вызываетdate.ctime()) соответствует стандарту C.
-
date.strftime(format)¶ Возвращает строку, представляющую дату, управляемую явным форматом строки. Формат коды, относящийся к часам, минутам или секундам, показывает 0 значения. Полный список директив форматирования см. в разделе strftime() и strptime() поведение.
-
date.__format__(format)¶ То же, что и
date.strftime(). Это позволяет указать формат строки для объектаdateв форматированные строковые литералы и при использованииstr.format(). Полный список директив форматирования см. в разделе strftime() и strptime() поведение.
Примеры использования: date¶
Пример подсчета дней до события:
>>> import time
>>> from datetime import date
>>> today = date.today()
>>> today
datetime.date(2007, 12, 5)
>>> today == date.fromtimestamp(time.time())
True
>>> my_birthday = date(today.year, 6, 24)
>>> if my_birthday < today:
... my_birthday = my_birthday.replace(year=today.year + 1)
>>> my_birthday
datetime.date(2008, 6, 24)
>>> time_to_birthday = abs(my_birthday - today)
>>> time_to_birthday.days
202
Больше примеров работы с date:
>>> from datetime import date
>>> d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
>>> d
datetime.date(2002, 3, 11)
>>> # Методы, связанные с форматированием вывода строки
>>> d.isoformat()
'2002-03-11'
>>> d.strftime("%d/%m/%y")
'11/03/02'
>>> d.strftime("%A %d. %B %Y")
'Monday 11. March 2002'
>>> d.ctime()
'Mon Mar 11 00:00:00 2002'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")
'The day is 11, the month is March.'
>>> # Способы извлечения "компонентов" под разными календарями
>>> t = d.timetuple()
>>> for i in t:
... print(i)
2002 # год
3 # месяц
11 # день
0
0
0
0 # день недели (0 = понедельник)
70 # 70th day in the year
-1
>>> ic = d.isocalendar()
>>> for i in ic:
... print(i)
2002 # ISO год
11 # ISO номер недели
1 # ISO номер дня ( 1 = понедельник )
>>> # Объект даты является неизменяемым; все операции создают новый объект
>>> 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 <= nколичество дней в данном месяце и году,0 <= hour < 24,0 <= minute < 60,0 <= second < 60,0 <= microsecond < 1000000,fold in [0, 1].
Если переданный аргумент вне этих диапазонов, то поднимается
ValueError.Добавлено в версии 3.6: Добавлен аргумент
fold.
Другие конструкторы, все методы класса:
-
classmethod
datetime.today()¶ Возвращает текущее значение локальной datetime с
tzinfoNone.Эквивалентный:
datetime.fromtimestamp(time.time())
См. также
now(),fromtimestamp().Этот метод функционально эквивалентен
now(), но без параметраtz.
-
classmethod
datetime.now(tz=None)¶ Возврат текущей локальной даты и времени.
Если дополнительный аргумент, tz -
Noneили не определенный, это похоже наtoday(), но, если это возможно, поставляет больше точности, чем можно получить от прохождения метки времениtime.time()(например, это может быть возможно на платформах, поставляющих функцию Cgettimeofday()).Если tz не является
None, он должен быть сущность подклассаtzinfo, а текущая дата и время преобразуются в часовой пояс tz.Эта функция предпочтительна по сравнению с
today()иutcnow().
-
classmethod
datetime.utcnow()¶ Возвращает текущую дату и время UTC с
tzinfoNone.Это как
now(), но возвращает текущую дату и время UTC как наивный объектdatetime. Текущее значение UTC datetime можно получить, вызвав функциюdatetime.now(timezone.utc). См. также разделnow().Предупреждение
Поскольку наивные объекты
datetimeрассматривают много методовdatetimeкак локальный времен, это предпочтено, чтобы использовать осведомленный datetimes, чтобы представлять времена в UTC. Таким образом, рекомендуется создать объект, представляющий текущее время в UTC, путем вызова методаdatetime.now(timezone.utc).
-
classmethod
datetime.fromtimestamp(timestamp, tz=None)¶ Возвращает локальную дату и время, соответствуя метке времени POSIX, той, которая возвращена
time.time(). Если дополнительный аргумент, tz -Noneили не определенный, метка времени, преобразован в локальную дату платформы и время, и возвращает наивный объектdatetime.Если tz не является
None, он должен быть сущность подклассаtzinfo, и временная метка преобразуется в часовой пояс tz.fromtimestamp()может поднятьOverflowError, если временная метка выходит за пределы диапазона значения, поддерживаемых функциями платформы Clocaltime()илиgmtime(), иOSErrorна отказlocaltime()илиgmtime(). Обычно это ограничивается годами с 1970 по 2038. Обратите внимание, что в системах без POSIX, которые включают високосные секунды в свое представление о временной метке, високосные секунды игнорируютсяfromtimestamp(), и тогда можно иметь две временные метки, отличающиеся на секунду, которые yield идентичныеdatetimeобъекты. Этот способ предпочтителен по сравнению сutcfromtimestamp().Изменено в версии 3.3: Поднимается
OverflowErrorвместоValueError, если временная метка выходит за пределы диапазона значения, поддерживаемых функциями платформы Clocaltime()илиgmtime(). ПоднимаетсяOSErrorвместоValueErrorнаlocaltime()илиgmtime()в случае сбоя.Изменено в версии 3.6:
fromtimestamp()может возвратить сущности с наборомfoldк 1.
-
classmethod
datetime.utcfromtimestamp(timestamp)¶ Возвращает UTC-
datetime, соответствующий временной метке POSIX, со значениемtzinfoNone. (Результирующий объект наивен.)Это может поднять
OverflowError, если метка времени вне диапазона значения, поддержанного функцией платформы Cgmtime()иOSErrorна неудачеgmtime(). Обычно это ограничивается годами с 1970 по 2038.Чтобы получить Знающий объект
datetime, вызовитеfromtimestamp():datetime.fromtimestamp(timestamp, timezone.utc)
На платформах, совместимых с POSIX, это эквивалентно следующему выражению:
datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
за исключением последней формулы всегда поддерживает полный диапазон лет: от
MINYEARдоMAXYEARвключительно.Предупреждение
Поскольку наивные объекты
datetimeрассматривают много методовdatetimeкак времена локальная, это предпочтено, чтобы использовать осведомленный datetimes, чтобы представлять времена в UTC. Таким образом, рекомендуется создать объект, представляющий определенную временную метку в формате UTC, путем вызова методаdatetime.fromtimestamp(timestamp, tz=timezone.utc).Изменено в версии 3.3: Поднимет
OverflowErrorвместоValueError, если метка времени вне диапазона значения, поддержанного функцией платформы Cgmtime(). ПоднимаетсяOSErrorвместоValueErrorв случае сбояgmtime().
-
classmethod
datetime.fromordinal(ordinal)¶ Возвращает
datetime, соответствующий пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1. ПодниметсяValueError, если не1 <= ordinal <= datetime.max.toordinal(). Все часы, минуты, секунды и микросекунды результата равны 0, аtzinfoравноNone.
-
classmethod
datetime.combine(date, time, tzinfo=self.tzinfo)¶ Возвращает новый объект
datetime, компоненты даты которого равны данным объектамdate, а компоненты времени равны данным объектамtime. Если задан аргумент tzinfo, то его значение является используемый для установкиtzinfoатрибут результата, в противном случаеtzinfoатрибут аргумента time является используемый.Поскольку любые
datetimeвозражают d,d == datetime.combine(d.date(), d.time(), d.tzinfo). Если дата является объектомdatetime, его временные компоненты иtzinfoатрибуты игнорируются.Изменено в версии 3.6: Добавлен аргумент tzinfo.
-
classmethod
datetime.fromisoformat(date_string)¶ Возвращает
datetime, соответствующий date_string в одном из форматов, выдаваемыхdate.isoformat()иdatetime.isoformat().В частности, эта функция поддерживает строки в формате:
YYYY-MM-DD [*HH [: MM [: SS [.fff [fff]]]] [+HH:MM [: SS [.ffffff]]]]
где
*может совпадать с любым отдельным символ.Осторожно
Он не поддерживает парсинг произвольной ISO 8601 строки - только предназначен как обратная операция
datetime.isoformat(). Более полнофункциональный ISO 8601 парсер,dateutil.parser.isoparseдоступен в стороннем пакете dateutil.Примеры:
>>> from datetime import datetime >>> datetime.fromisoformat('2011-11-04') datetime.datetime(2011, 11, 4, 0, 0) >>> datetime.fromisoformat('2011-11-04T00:05:23') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> datetime.fromisoformat('2011-11-04 00:05:23.283') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000) >>> datetime.fromisoformat('2011-11-04 00:05:23.283+00:00') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc) >>> datetime.fromisoformat('2011-11-04T00:05:23+04:00') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
Добавлено в версии 3.7.
-
classmethod
datetime.fromisocalendar(year, week, day)¶ Возвращает
datetime, соответствующий дате календаря ISO, указанной по году, неделе и дню. Компоненты недаты даты и времени населены с их нормальным дефолтом значения. Это инверсия функцииdatetime.isocalendar().Добавлено в версии 3.8.
-
classmethod
datetime.strptime(date_string, format)¶ Возвращает
datetime, соответствующий date_string, анализируемый в соответствии с format.Это эквивалентно:
datetime(*(time.strptime(date_string, format)[0:6]))
ValueErrorвызывается, если date_string и формат не могут быть проанализированыtime.strptime()или если он возвращает значение, которая не является кортежем времени. Полный список директив форматирования см. в разделе strftime() и strptime() поведение.
Атрибуты класса:
-
datetime.max¶ Последний представимый
datetime,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None).
-
datetime.resolution¶ Наименьшая возможная разница между неравнозначными
datetimeобъектами,timedelta(microseconds=1).
Экземпляр атрибуты (только для чтения):
-
datetime.month¶ От 1 до 12 включительно.
-
datetime.day¶ От 1 до числа дней в данном месяце данного года.
-
datetime.hour¶ В
range(24).
-
datetime.minute¶ В
range(60).
-
datetime.second¶ В
range(60).
-
datetime.microsecond¶ В
range(1000000).
-
datetime.tzinfo¶ Объект передаётся как аргумент tzinfo конструктору
datetimeилиNone, если ни один не был передан.
-
datetime.fold¶ В
[0, 1]. Используется для устранения неоднозначности времени стенки в течение повторяющегося интервала. (Повторный интервал возникает, когда часы откатываются в конце летнего времени или когда смещение UTC для текущей зоны уменьшается по политическим причинам.) значение 0 (1) представляет более ранний (более поздний) из двух моментов с одним и тем же представлением времени стенки.Добавлено в версии 3.6.
Поддерживаемые операции:
| Операция | Результат |
|---|---|
datetime2 = datetime1 + timedelta |
(1) |
datetime2 = datetime1 - timedelta |
(2) |
timedelta = datetime1 - datetime2 |
(3) |
datetime1 < datetime2 |
Сравнивнение datetime с
datetime. (4) |
datetime2 - длительность временного интервала, удаляемого из даты времени 1, движущегося вперед во времени, если
timedelta.days> 0, или назад, еслиtimedelta.days< 0. Результат имеет те жеtzinfoатрибут, что и входной datetime, и datetime2 - datetime1 = = timedelta после.OverflowErrorподнимается, если datetime2.year будет меньшеMINYEARили большеMAXYEAR. Обратите внимание, что коррекция часовых поясов не выполняется, даже если вводимые данные являются объектом с информацией.Вычисляет datetime2 так, что datetime2 + timedelta == datetime1. Что касается добавления, то результат имеет то же значение
tzinfoатрибут, что и входное значение datetime, и никаких корректировок часового пояса не производится, даже если входные данные известны.Вычитание
datetimeизdatetimeопределяется только в том случае, если оба операнда являются наивными или они оба известны. Если один знающий, а другой наивен, то поднимаетсяTypeError.Если оба наивны, или оба знающие и имеют тот же атрибут
tzinfo,tzinfoатрибуты проигнорированы, и результат - объектtimedeltat, таким образом чтоdatetime2 + t == datetime1. В этом случае корректировка часового пояса не выполняется.Если и то и другое известно, и имеет разные атрибуты
tzinfo,a-bдействует так, как будто a и b сначала были преобразованы в наивные UTC-даты. Результат -(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())за исключением того, что внедрение никогда не переполняется.datetime1 считается меньше datetime2, когда datetime1 предшествует datetime2 во времени.
Если один компаранд наивен, и другой знающий, то поднимается
TypeError, если предпринято сравнение порядка. Для сравнения равенства наивные сущности никогда не равны знающим сущностям.Если оба компаранда знают, и имеют тот же атрибут
tzinfo, общийtzinfoатрибут игнорируется, и основа datetimes сравнивается. Если оба сравнения знающие и имеют различные атрибутыtzinfo, сравнения сначала корректируются путем вычитания их смещений UTC (полученных изself.utcoffset()).Изменено в версии 3.3: Сравнения равенства между знающим и наивным
datetimeсущностями не поднимаютTypeError.Примечание
Для того, чтобы отановить порядок сравнения к стандартной схеме сравнения адреса объектов, сравнение даты и времени обычно поднимает
TypeError, если другое сравнение также не является объектомdatetime. Однако вместо этого возвращается значениеNotImplemented, если другое сравнение имеет значениеtimetuple()атрибут. Этот хук дает возможность другим видам объектов даты реализовать сравнение смешанного типа. Если нет, то при сравнении объектаdatetimeс объектом другого типа возникает объектTypeError, если сравнение не является==или!=. Последние случаи возвращаютFalseилиTrueсоответственно.
Методы сущности:
-
datetime.time()¶ Возвращает объект
timeс тем же часом, минутой, во-вторых, микросекундой и сгибом.tzinfoестьNone. См. также методtimetz().Изменено в версии 3.6: Гибка значение копируется в возвращаемый объект
time.
-
datetime.timetz()¶ Возвращает объект
timeс тем же часом, минутой, во-вторых, микросекундой, сгибом и tzinfo атрибутами. См. также методtime().Изменено в версии 3.6: Сгибаемое значение копируется в возвращаемый объект
time.
-
datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)¶ Возвращает datetime с теми же атрибутами, за исключением тех атрибутов, которые переданы новыми значениями независимо от того, какие ключевые аргументы определены. Обратите внимание, что
tzinfo=Noneможет быть определен, чтобы создать наивную 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 # Преобразовать self в UTC и прикрепить новый объект часового пояса. utc = (self - self.utcoffset()).replace(tzinfo=tz) # Конвертировать из UTC в местное время tz. return tz.fromutc(utc)
Изменено в версии 3.3: tz теперь можно опустить.
Изменено в версии 3.6: Метод
astimezone()можно теперь вызвать на наивных сущностях, которые, как предполагают, представляют системное локализованное время.
-
datetime.utcoffset()¶ Если
tzinfoявляетсяNone, возвращаетNone, иначе возвращаетself.tzinfo.utcoffset(self)и вызывает исключение, если последний не возвращаетNoneили объектtimedeltaс величиной менее одного дня.Изменено в версии 3.7: Смещение UTC не ограничивается целым числом минут.
-
datetime.dst()¶ Если
tzinfoявляетсяNone, возвращаетNone, иначе возвращаетself.tzinfo.dst(self)и вызывает исключение, если последний не возвращаетNoneили объектtimedeltaс величиной менее одного дня.Изменено в версии 3.7: Смещение перехода на летнее и зимнее время не ограничивается целым количеством минут.
-
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():tzinfoisNoneилиdst()возвращаетNone,tm_isdstустанавливается в-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; в результате использованиеutcfromtimetupleможет привести к вводящим в заблуждение результатам. Если у вас есть наивныйdatetime, представляющий UTC, используйтеdatetime.replace(tzinfo=timezone.utc), чтобы сделать его знающим, и в этот момент вы можете использоватьdatetime.timetuple().
-
datetime.toordinal()¶ Возвращает пролептический григорианский порядковый номер даты. То же, что и
self.date().toordinal().
-
datetime.timestamp()¶ Возвращает временную метку POSIX, соответствующую
datetimeсущности. Возвращающее значение является подобнымfloatвозвращенномуtime.time().Предполагается, что наивные
datetimeсущности представляют локальное время, и этот метод опирается на функцию платформы Cmktime()для выполнения преобразования. Посколькуdatetimeподдерживает более широкий спектр значения, чемmktime()на многих платформах, этот метод может подниматьOverflowErrorна времена, далекие от прошлого или далеко в будущем.Для знающих сущностей
datetimeвозвращаемое значение вычислено как:(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
Добавлено в версии 3.3.
Изменено в версии 3.6: Метод
timestamp()используетfoldатрибут для устранения неоднозначности времени в течение повторяющегося интервала.Примечание
Не существует метода получения временной метки POSIX непосредственно из наивного
datetimeсущности, представляющего время UTC. Если приложение использует это соглашение, а часовой пояс системы не установлен в значение UTC, можно получить отметку времени POSIX, предоставив командуtzinfo=timezone.utc:timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
или путем непосредственного вычисления временной метки:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
-
datetime.weekday()¶ Возвращает день недели в виде целого числа, где понедельник равен 0, а воскресенье - 6. То же, что и
self.date().weekday(). См. также разделisoweekday().
-
datetime.isoweekday()¶ Возвращает день недели как целое число, где понедельник 1, а воскресенье 7. То же, что и
self.date().isoweekday(). См. такжеweekday(),isocalendar().
-
datetime.isocalendar()¶ Возвращает 3-кортеж, (год ISO, номер недели ISO, день недели ISO). То же, что и
self.date().isocalendar().
-
datetime.isoformat(sep='T', timespec='auto')¶ Возвращает строку, представляющую дату и время в формате ISO 8601:
YYYY-MM-DDTHH:MM:SS.ffffff, еслиmicrosecondне 0YYYY-MM-DDTHH:MM:SS, еслиmicrosecond0
Если
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): ... """Часовой пояс с произвольным постоянным смещением -06:39.""" ... 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', еслиmicrosecond0, то же, что и'microseconds'иначе.'hours': включитьhourв двухзначный форматHH.'minutes': включитьhourиminuteв форматеHH:MM.'seconds': включитьhour,minuteиsecondв форматеHH:MM:SS.'milliseconds': включить полный рабочий день, но усечь дробную вторую часть до миллисекунд. ФорматHH:MM:SS.sss.'microseconds': включить полный рабочий день в форматеHH:MM:SS.ffffff.
Примечание
Исключенные компоненты времени усекаются, а не округляются.
ValueErrorбудет вызван для недопустимого аргумента timespec:>>> from datetime import datetime >>> datetime.now().isoformat(timespec='minutes') '2002-12-25T00:00' >>> dt = datetime(2015, 1, 1, 12, 30, 59, 0) >>> dt.isoformat(timespec='microseconds') '2015-01-01T12:30:59.000000'
Добавлено в версии 3.6: Добавлен аргумент timespec.
-
datetime.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()))
на платформах, где родная функция
ctime()(котораяtime.ctime()вызывает, но не вызываемаdatetime.ctime()) соответствует стандарту C.
-
datetime.strftime(format)¶ Возвращает строку, представляющую дату и время, управляемая явным форматом строки. Полный список директив форматирования см. в разделе strftime() и strptime() поведение.
-
datetime.__format__(format)¶ То же, что и
datetime.strftime(). Это позволяет указать формат строка для объектаdatetimeв форматированные строковые литералы и при использованииstr.format(). Полный список директив форматирования см. в разделе strftime() и strptime() поведение.
Примеры использования: datetime¶
Примеры работы с объектами datetime:
>>> from datetime import datetime, date, time, timezone
>>> # Использование datetime.combine()
>>> d = date(2005, 7, 14)
>>> t = time(12, 30)
>>> datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)
>>> # Использование 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)
>>> # Использование datetime.strptime()
>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
>>> dt
datetime.datetime(2006, 11, 21, 16, 30)
>>> # Использование datetime.timetuple() получить кортеж всех атрибутов
>>> tt = dt.timetuple()
>>> for it in tt:
... print(it)
...
2006 # год
11 # месяц
21 # день
16 # час
30 # минута
0 # секунда
1 # день недели (0 = понедельник)
325 # количество дней с 1 января
-1 # dst - метод tzinfo.dst() возвращает None
>>> # Дата в ISO формате
>>> ic = dt.isocalendar()
>>> for it in ic:
... print(it)
...
2006 # ISO год
47 # ISO неделя
2 # ISO день недели
>>> # Форматирование даты и времени
>>> dt.strftime("%A, %d. %B %Y %I:%M%p")
'Tuesday, 21. November 2006 04:30PM'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(dt, "day", "month", "time")
'The day is 21, the month is November, the time is 04:30PM.'
Приведенный ниже пример определяет tzinfo подкласса сбор информации часового пояса
для Кабула, Афганистан, который использует +4 UTC до 1945 и затем +4:30 UTC после
этого:
from datetime import timedelta, datetime, tzinfo, timezone
class KabulTz(tzinfo):
# Кабул используемый +4 до 1945 года, когда они перешли в +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):
# Неоднозначный ("мнимый") полуторачасовой диапазон, представляющий "кратность" по
# времени вследствие сдвига от + 4 до + 4:30. Если dt попадает в воображаемый
# диапазон, используйте fold, чтобы решить, как разрешить. См. PEP495.
return timedelta(hours=4, minutes=(30 if dt.fold else 0))
else:
return timedelta(hours=4, minutes=30)
def fromutc(self, dt):
# Выполнить те же проверки, что и в 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")
# Для fromutc требуется пользовательская реализация, так как входным значением
# этой функции является datetime с utc значения, но tzinfo со значением self. См.
# datetime.astimezone или 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):
# Кабул не соблюдает летнее время.
return timedelta(0)
def tzname(self, dt):
if dt >= self.UTC_MOVE_DATE:
return "+04:30"
return "+04"
Использование KabulTz сверху:
>>> tz1 = KabulTz()
>>> # Дата-время перед изменением
>>> dt1 = datetime(1900, 11, 21, 16, 30, tzinfo=tz1)
>>> print(dt1.utcoffset())
4:00:00
>>> # Дата-время после изменения
>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=tz1)
>>> print(dt2.utcoffset())
4:30:00
>>> # Преобразование даты и времени в другой часовой пояс
>>> 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 < 240 <= minute < 600 <= second < 600 <= microsecond < 1000000fold in [0, 1].
Если аргумент вне тех диапазонов дан, поднимается
ValueError. Все значения по умолчанию -0, кроме tzinfo, по умолчанию -None.
Атрибуты класса:
-
time.resolution¶ Наименьшая возможная разница между неравнозначными
timeобъектами,timedelta(microseconds=1), хотя заметьте, что арифметика наtimeобъектах не поддерживается.
Атрибуты экземпляра (только для чтения):
-
time.hour¶ В
range(24).
-
time.minute¶ В
range(60).
-
time.second¶ В
range(60).
-
time.microsecond¶ В
range(1000000).
-
time.tzinfo¶ Объект передан в качестве аргумента tzinfo конструктору
timeилиNone, если ни один из них не был передан.
-
time.fold¶ В
[0, 1]. Используется для устранения неоднозначности временного сгиба в течение повторяющегося интервала. (Повторный интервал возникает, когда часы откатываются в конце летнего времени или когда смещение UTC для текущей зоны уменьшается по политическим причинам.) значение 0 (1) представляет более ранний (более поздний) из двух моментов с одним и тем же представлением временем сгиба.Добавлено в версии 3.6.
time объекты поддерживают сравнение time с time, где
a считается меньше b, когда a предшествует
b во времени. Если один компаранд наивен, и другой знающий, поднимается TypeError,
если предпринято сравнение по порядку. Для сравнения равенства наивные
сущности никогда не равны знающим сущностям.
Если оба сравнения осведомлены и имеют одинаковый атрибут tzinfo, общее
значение tzinfo атрибут игнорируется и сравнивается базовое время. Если
оба сравнения знающие и имеют разные атрибуты tzinfo, сравнения сначала
корректируются путем вычитания их смещений UTC (полученных из self.utcoffset()). Для
того, чтобы остановить возврат сравнений смешанного типа к сравнению по
умолчанию по адресу объекта, когда объект time сравнивается с объектом
другого типа, поднимается TypeError, если сравнение не является ==
или !=. Последние случаи возвращают False или True
соответственно.
Изменено в версии 3.3: Сравнения равенства между знающим и наивным time сущности не
поднимают TypeError.
В логических контекстах объект time всегда считается истинным.
Изменено в версии 3.5: До Python 3.5 объект time считался ложным, если он представлял полночь в UTC.
Такое поведение считалось неясным и подверженным ошибкам и было удалено в
Python 3.5. Полную информацию см. в разделе bpo-13936.
Другой конструктор:
-
classmethod
time.fromisoformat(time_string)¶ Возвращает
time, соответствующий time_string в одном из форматов, выдаваемыхtime.isoformat(). В частности, эта функция поддерживает строки в формате:HH [:MM [:SS [.fff [fff]]]] [+HH:MM [:SS [.ffffff]]]
Осторожно
Это не делает поддержку парсинга произвольной ISO 8601 строки. Она предназначена только как обратная операция
time.isoformat().Примеры:
>>> from datetime import time >>> time.fromisoformat('04:23:01') datetime.time(4, 23, 1) >>> time.fromisoformat('04:23:01.000384') datetime.time(4, 23, 1, 384) >>> time.fromisoformat('04:23:01+04:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
Добавлено в версии 3.7.
Методы сущности:
-
time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)¶ Возвращает
timeс тем же значением, за исключением тех атрибутов, которые переданы новыми значениями независимо от того, какие ключевые аргументы указаны. Обратите внимание, чтоtzinfo=Noneможет быть определен, чтобы создать наивныйtimeиз знающегоtimeбез преобразования данных времени.Добавлено в версии 3.6: Добавлен аргумент
fold.
-
time.isoformat(timespec='auto')¶ Возвращает строку, представляющий время в формате ISO 8601, одним из:
HH:MM:SS.ffffff, еслиmicrosecondне равно 0HH:MM:SS, еслиmicrosecondравно 0HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], еслиutcoffset()не возвращаетNoneHH:MM:SS+HH:MM[:SS[.ffffff]], еслиmicrosecondравно 0 иutcoffset()не возвращаетNone
Дополнительный аргумент timespec указывает количество дополнительных компонентов времени для включения (по умолчанию -
'auto'). Это может быть одно из следующих:'auto': то же, что и'seconds', еслиmicrosecond0, то же, что и'microseconds'иначе.'hours': включитьhourв двухзначный форматHH.'minutes': включитьhourиminuteв форматеHH:MM.'seconds': включитьhour,minuteиsecondв форматеHH:MM:SS.'milliseconds': включить полный рабочий день, но усечь дробную вторую часть до миллисекунд. ФорматHH:MM:SS.sss.'microseconds': включить полный рабочий день в форматеHH:MM:SS.ffffff.
Примечание
Исключенные компоненты времени усекаются, а не округляются.
Будет поднято
ValueErrorдля недопустимого аргумента timespec.Пример:
>>> from datetime import time >>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes') '12:34' >>> dt = time(hour=12, minute=34, second=56, microsecond=0) >>> dt.isoformat(timespec='microseconds') '12:34:56.000000' >>> dt.isoformat(timespec='auto') '12:34:56'
Добавлено в версии 3.6: Добавлен аргумент timespec.
-
time.__str__()¶ Для времени t,
str(t)эквивалентенt.isoformat().
-
time.strftime(format)¶ Возвращает строку, представляющей время, контролируемое явным форматом строки. Полный список директив форматирования см. в разделе strftime() и strptime() поведение.
-
time.__format__(format)¶ То же, что и
time.strftime(). Это позволяет указать форматированную строку для объектаtimeв форматированные строковые литералы и при использованииstr.format(). Полный список директив форматирования см. в разделе strftime() и strptime() поведение.
-
time.utcoffset()¶ Если
tzinfoявляетсяNone, возвращаетNone, иначе возвращаетself.tzinfo.utcoffset(None)и вызывает исключение, если последний не возвращаетNoneили объектtimedeltaс величиной менее одного дня.Изменено в версии 3.7: Смещение UTC не ограничивается целым числом минут.
-
time.dst()¶ Если
tzinfoявляетсяNone, возвращаетNone, иначе возвращаетself.tzinfo.dst(None), и вызывает исключение, если последний не возвращаетNone, или объектtimedeltaс величиной менее одного дня.Изменено в версии 3.7: Смещение перехода на летнее и зимнее время не ограничивается целым количеством минут.
-
time.tzname()¶ Если
tzinfoявляетсяNone, возвращаетNone, иначе возвращаетсяself.tzinfo.tzname(None)или вызывает исключение, если последний не возвращаетNoneили объект строка.
Примеры использования: time¶
Примеры работы с объектом time:
>>> from datetime import time, tzinfo, timedelta
>>> class TZ1(tzinfo):
... def utcoffset(self, dt):
... return timedelta(hours=1)
... def dst(self, dt):
... return timedelta(0)
... def tzname(self,dt):
... return "+01:00"
... def __repr__(self):
... return f"{self.__class__.__name__}()"
...
>>> t = time(12, 10, 30, tzinfo=TZ1())
>>> t
datetime.time(12, 10, 30, tzinfo=TZ1())
>>> t.isoformat()
'12:10:30+01:00'
>>> t.dst()
datetime.timedelta(0)
>>> t.tzname()
'+01:00'
>>> t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
>>> 'The {} is {:%H:%M}.'.format("time", t)
'The time is 12:10.'
Объекты tzinfo¶
-
class
datetime.tzinfo¶ Это абстрактный базовый класс, означающий, что этот класс не должен создаваться непосредственно. Определите подкласс
tzinfoдля сбора информации об определенном часовом поясе.Экземпляр (конкретный подкласс)
tzinfoможет быть передан в конструкторы объектовdatetimeиtime. Последние объекты рассматривают свои атрибуты как находящиеся в локальном времени, и объектtzinfoподдерживает методы, раскрывающие смещение локальная времени от UTC, имя часового пояса и смещение DST, все относительно переданного им объекта даты или времени.Необходимо вывести конкретный подкласс и (по крайней мере) предоставить реализации стандартных методов
tzinfo, необходимых для используемых методовdatetime. Модульdatetimeпредоставляетtimezone, простой конкретный подклассtzinfo, который может представлять часовые пояса с фиксированным смещением от UTC, например, сам UTC или североамериканский EST и EDT.Особое требование для пиклинга: A
tzinfoподкласс должен иметь метод__init__(), который может быть вызван без аргументов, в противном случае его можно пиклинг, но, возможно, не распиклинг повторно. Это техническое требование, которое может быть смягчено в будущем.Конкретный подкласс
tzinfo, возможно, должен осуществить следующие методы. Точно то, какие методы необходимы, зависит от использования, сделанного из знающих объектовdatetime. Если есть сомнения, просто реализуйте все из них.
-
tzinfo.utcoffset(dt)¶ Возвращаемое смещение локального времени от UTC в виде объекта
timedelta, положительного к востоку от UTC. Если время локальная к западу от UTC, это должно быть отрицательно.Это представляет смещение total от UTC; например, если объект
tzinfoпредставляет регулировку как часового пояса, так и перехода на летнее и зимнее время,utcoffset()должен вернуть их сумму. Если смещение UTC неизвестно, Возвращает значениеNone. Еще значение возвратился, должен быть объектtimedeltaстрого между-timedelta(hours=24), иtimedelta(hours=24)(величина погашения должна составить меньше чем один день). Большинство реализацийutcoffset(), вероятно, будет выглядеть как одна из этих двух:return CONSTANT # класс с фиксированным смещением return CONSTANT + self.dst(dt) # дневной класс
Если
utcoffset()не возвращаетNone,dst()не должен возвращатьNone.Экстремальное значение по умолчанию
utcoffset()поднимаетNotImplementedError.Изменено в версии 3.7: Смещение UTC не ограничивается целым числом минут.
-
tzinfo.dst(dt)¶ Возвращает корректировку на DST время в качестве объекта
timedeltaилиNone, если информация о DTS неизвестна.Возвращает
timedelta(0), если DST не действует. Если DST действует, возвращает смещение в виде объектаtimedelta(подробнее см. разделutcoffset()). Обратите внимание, что смещение DST, если применимо, уже было добавлено к смещению UTC, возвращенномуutcoffset(), поэтому нет необходимости консультироваться сdst(), если вы не заинтересованы в получении информации о DST отдельно. Например,datetime.timetuple()вызывает методtzinfoатрибутаdst(), чтобы определить, как должен быть установлен флагtm_isdst, иtzinfo.fromutc()вызываетdst(), чтобы учесть изменения DST при пересечении часовых поясов.Экземпляр tz подкласса
tzinfo, которое моделирует как стандартное, так и дневное время, должно быть согласованным в этом смысле:tz.utcoffset(dt) - tz.dst(dt)должен возвратить тот же результат для каждого
datetimedt сdt.tzinfo == tz. Для нормальных подклассовtzinfo, это выражение приводит к «стандартному смещению часового пояса», которое не должно зависеть от даты или времени, но только от географическом положении. Реализацияdatetime.astimezone()опирается на это, но не может выявить нарушения; программист несет ответственность за это. Еслиtzinfoподкласс не может гарантировать это, он может быть в состоянии переопределить реализацию по умолчаниюtzinfo.fromutc(), чтобы правильно работать сastimezone()независимо.Большинство реализаций
dst(), вероятно, будет выглядеть как одна из этих двух:def dst(self, dt): # класс с фиксированным смещением: не учитывает DST return timedelta(0)
или:
def dst(self, dt): # Код для установки dston и dstoff ко временам перехода часового пояса DST # на основе ввода dt.year и выразить в стандартном времени локали. 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 подходит, если класс хочет сказать, что объекты
времени не участвуют в протоколах 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()без проблем. Он достаточно силен для работы с часовыми поясами с фиксированным смещением, и часовыми поясами, учитывающими как стандартное, так и летнее время, и последнее, даже если время DST различается в разные годы. Пример часового пояса с реализацией по умолчаниюfromutc()может не обрабатываться правильно во всех случаях, является тем, где стандартное смещение (от UTC) зависит от переданной определенной даты и время, которое может произойти по политическим причинам. Реализации по умолчаниюastimezone()иfromutc()могут не привести к требуемому результату, если результат является одним часом, пересекающимся с моментом изменения стандартного смещения.Пропуская код для ошибочных случаев, реализация по умолчанию
fromutc()действует как:def fromutc(self, dt): # поднимается ошибка CreateError, если dt.tzinfo не является self dtoff = dt.utcoffset() dtdst = dt.dst() # поднимается CreateError, если dtoff содержит значение None, а dtdst - значение None delta = dtoff - dtdst # this is self's standard offset if delta: dt += delta # преобразовать в локальное стандартное время dtdst = dt.dst() # поднимается CreateError, если dtdst имеет значение None if dtdst: return dt + dtdst else: return dt
В следующем файле tzinfo_examples.py есть несколько
примеров классов tzinfo:
Обратите внимание, что есть неизбежная тонкость дважды в год в tzinfo подклассе,
составляющем и стандарт и летнее время в точках перехода DST. Для конкретики рассмотрим US
Eastern (UTC -0500), где EDT начинается через минуту после 1:59 (EST) во второе
воскресенье марта, и заканчивается через минуту после 1:59 (EDT) в первое
воскресенье ноября:
UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM
EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM
EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM
start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM
end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM
Когда DST начинается (линия «начала»), стенные прыжки часов локальная с 1:59
до 3:00. Настенное время формы 2: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
Когда DST заканчивается (линия «конца»), есть потенциально худшая проблема: есть
час, который не может быть записан однозначно в стенное время локальная: в
последний час летнего времени. В восточном это - времена формы 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 часа)).
См.также
- dateutil.tz
Модуль
datetimeимеет базовый классtimezone(для обработки произвольных фиксированных смещений от UTC) и егоtimezone.utcатрибут (экземпляр часового пояса UTC).Библиотека dateutil.tz выводит IANA база данных часовых поясов (также известную как база данных Olson) в Python, и рекомендуется его использование.
- 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() class создает объект datetime из строки,
представляющего дату и время и соответствующий формате строки.
В таблице ниже представлено высокоуровневое сравнение показателей strftime() и
strptime():
strftime |
strptime |
|
|---|---|---|
| Использование | Преобразовать объект в строку в соответствии с заданным форматом | Парсинг строки в объект datetime, учитывая соответствующий формат |
| Тип метода | Метод экземпляра | Метод класса |
| Метод из | date; datetime; time |
datetime |
| Сигнатура | strftime(format) |
strptime(date_string, format) |
strftime() и strptime() коды формата¶
Ниже приведен список всех форматов кодов, которые требует стандарт 1989 C, и эти работы на всех платформах со стандартной реализацией C.
| Директива | Значение | Пример | Прим. |
|---|---|---|---|
%a |
Будний день как сокращенное название в локали. | Sun, Mon, …, Sat
(en_US);
So, Mo, …, Sa
(de_DE)
|
(1) |
%A |
День недели как полное название в локали. | Sunday, Monday, …,
Saturday (en_US);
Sonntag, Montag, …,
Samstag (de_DE)
|
(1) |
%w |
День недели в виде десятичного числа, где 0 - воскресенье, а 6 - суббота. | 0, 1, …, 6 | |
%d |
День месяца в виде десятичного числа с лидирующими нулями. | 01, 02, …, 31 | (9) |
%b |
Месяц как сокращенное название локали. | Jan, Feb, …, Dec
(en_US);
Jan, Feb, …, Dez
(de_DE)
|
(1) |
%B |
Месяц как полное имя в локали. | January, February,
…, December (en_US);
Januar, Februar, …,
Dezember (de_DE)
|
(1) |
%m |
Месяц в виде десятичного числа с лидирующими нулями. | 01, 02, …, 12 | (9) |
%y |
Год без века в виде десятичного числа с лидирующими нулями. | 00, 01, …, 99 | (9) |
%Y |
Год с веком как десятичное число. | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (2) |
%H |
Час (24-часовые часы) в виде десятичного числа с нулевым числом. | 00, 01, …, 23 | (9) |
%I |
Час (12-часовые часы) в виде десятичного числа с нулевым числом. | 01, 02, …, 12 | (9) |
%p |
Языковой стандарт эквивалентен AM или PM. | AM, PM (en_US);
am, pm (de_DE)
|
(1), (3) |
%M |
Минута в виде десятичного числа с нулевым числом. | 00, 01, …, 59 | (9) |
%S |
Секунда в виде десятичного числа с нулевым заполнением. | 00, 01, …, 59 | (4), (9) |
%f |
Микросекунда - десятичное число, заполненное нулем слева. | 000000, 000001, …, 999999 | (5) |
%z |
Смещение UTC в формате
±HHMM[SS[.ffffff]] (пустая
строка, если объект
наивен). |
(empty), +0000, -0400, +1030, +063415, -030712.345216 | (6) |
%Z |
Имя часового пояса (пустая строка, если объект является наивным). | (empty), UTC, EST, CST | |
%j |
День года в виде десятичного числа с нулевым числом. | 001, 002, …, 366 | (9) |
%U |
Номер недели года (воскресенье как первый день недели) в виде нулевого десятичного числа. Все дни в новом году, предшествующие первому воскресенью, считаются 0 в неделе. | 00, 01, …, 53 | (7), (9) |
%W |
Номер недели года (понедельник как первый день недели) в виде десятичного числа. Все дни в новом году, предшествующие первому понедельнику, считаются неделями 0. | 00, 01, …, 53 | (7), (9) |
%c |
Соответствующее представление даты и времени языкового стандарта. | Tue Aug 16 21:30:00
1988 (en_US);
Di 16 Aug 21:30:00
1988 (de_DE)
|
(1) |
%x |
Соответствующее представление rдаты языкового стандарта. | 08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
|
(1) |
%X |
Соответствующее представление времени языкового стандарта. | 21:30:00 (en_US);
21:30:00 (de_DE)
|
(1) |
%% |
А литерал '%' символ. |
% |
Для удобства включены несколько дополнительных директив, не требуемых стандартом C89. Все эти параметры соответствуют ISO 8601 значениям дат.
| Директива | Значение | Пример | Прим. |
|---|---|---|---|
%G |
ISO 8601 год с веком,
представляющим год, который
содержит большую часть
ISO недели (%V). |
0001, 0002, …, 2013, 2014, …, 9998, 9999 | (8) |
%u |
День недели ISO 8601 в виде десятичного числа, где 1 - понедельник. | 1, 2, …, 7 | |
%V |
Неделя 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 заменяют их.
По той же причине обработка форматной строки, содержащего кодовые точки
Юникод, которые не могут быть представлены в кодировке текущего места
действия, также зависимы от платформы. На одних платформах такие кодовые точки
сохраняются нетронутыми в выходных данных, в то время как на других
strftime могут поднимать UnicodeError или возвращать вместо них пустую
строку.
Примечания:
Поскольку формат зависит от текущего языкового стандарта, следует соблюдать осторожность при создании предположений относительно выходного значения. Порядок полей изменяется (например, «месяц/день/год» против «дня/месяца/года»), и вывод может содержать Юникод симолы кодировки, используя по умолчанию локальные кодировки (например, если текущая локаль -
ja_JP, кодировка по умолчанию может бы быть любой изeucJP,SJISилиutf-8; используйтеlocale.getlocale()для определения текущей локальной кодировки).Метод
strptime()может анализировать годы в полном диапазоне [1, 9999], но годы < 1000 должны быть заполнены нулем до 4-значной ширины.Изменено в версии 3.2: В предыдущих версиях метод
strftime()ограничивался годами >= 1900.Изменено в версии 3.3: В версии 3.2 метод
strftime()был ограничен годами >= 1000.Когда используемая с методом
strptime(), директива%pтолько затрагивает поле часа вывода, если используется директива%I, чтобы распарсить час.В отличие от модуля
time, модульdatetimeне поддерживает високосные секунды.Когда используемый с методом
strptime(), директива%fпринимает от одной до шести цифр и набивающих нулей справа.%f- расширение набора символов формата в стандарте C (но реализованное отдельно в объектах datetime и, следовательно, всегда доступное).Для наивного объекта формат
%zи%Zкодов заменяется пустыми строками.Для знающего объекта:
%zutcoffset()преобразуется в строку формы±HHMM[SS[.ffffff]], гдеHH- 2-значный строка, дающий количество часов смещения UTC,MM- 2-значный строка, дающий количество минут смещения UTC,SS- это 2-значный строка, дающий число секунд смещения UTC, аffffff- 6-значное строка, дающее количество микросекунд смещения 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еслиtzname()возвращаетNone,%Zзаменяется пустой строкой. В противном случае%Zзаменяется возвращаемым значением, которое должно быть строкой.Когда используются с методом
strptime(),%Uи%W- только используются в вычислениях, когда определен день недели и календарный год (%Y).Аналогично
%Uи%W,%Vиспользуются в расчетах только в том случае, когда день недели и год ISO (%G) указаны в форматеstrptime()строки. Также следует отметить, что%Gи%Yне являются взаимозаменяемыми.Когда используемый с методом
strptime(), ведущий ноль опционален для форматов%d,%m,%H,%I,%M,%S,%J,%U,%Wи%V. Формат%yтребует начального нуля.
Сноски
| [1] | Если есть, мы игнорируем эффекты Относительности |
| [2] | Это соответствует определению «пролептического Григорианского» календаря в Дершовица и книге Рейнгольда Календарные расчеты, где это базовый календарь для всех вычислений. Смотрите в книге алгоритмы преобразования между пролептическими Григорианскими ординалами и многими другими календарными системами. |
| [3] | См. R. H. van Gent’s руководство по математике календаря ISO 8601 для хорошего объяснения. |
| [4] | Предача datetime.strptime('Feb 29', '%b %d') провалится, так как 1900 не високосный год. |
