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
не являетсяNone
d.tzinfo.utcoffset(d)
не возвращаетNone
Иначе d наивен.
Объект time
t знающий, если выполняются оба из следующих утвержений:
t.tzinfo
не являетсяNone
t.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 < 1000000
0 <= seconds < 3600*24
(количество секунд за один день)-999999999 <= days <= 999999999
В следующем примере показано, как любые аргументы, кроме days, seconds и microseconds, объединяются и нормализуются в эти три результирующих атрибута:
>>> from datetime import timedelta >>> delta = timedelta( ... days=50, ... seconds=27, ... microseconds=10, ... milliseconds=29000, ... minutes=5, ... hours=8, ... weeks=2 ... ) >>> # Остались только дни, секунды и микросекунды >>> 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 <= MAXYEAR
1 <= month <= 12
1 <= 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 с
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.Эта функция предпочтительна по сравнению с
today()
иutcnow()
.
-
classmethod
datetime.
utcnow
()¶ Возвращает текущую дату и время UTC с
tzinfo
None
.Это как
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, со значением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
как времена локальная, это предпочтено, чтобы использовать осведомленный 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
атрибуты проигнорированы, и результат - объектtimedelta
t, таким образом что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()
:tzinfo
isNone
или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
, если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): ... """Часовой пояс с произвольным постоянным смещением -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'
, еслиmicrosecond
0, то же, что и'microseconds'
иначе.'hours'
: включитьhour
в двухзначный форматHH
.'minutes'
: включитьhour
иminute
в форматеHH:MM
.'seconds'
: включитьhour
,minute
иsecond
в форматеHH:MM:SS
.'milliseconds'
: включить полный рабочий день, но усечь дробную вторую часть до миллисекунд. ФорматHH:MM:SS.sss
.'microseconds'
: включить полный рабочий день в форматеHH:MM:SS.ffffff
.
Примечание
Исключенные компоненты времени усекаются, а не округляются.
ValueError
будет вызван для недопустимого аргумента timespec:>>> from datetime import datetime >>> datetime.now().isoformat(timespec='minutes') '2002-12-25T00:00' >>> dt = datetime(2015, 1, 1, 12, 30, 59, 0) >>> dt.isoformat(timespec='microseconds') '2015-01-01T12:30:59.000000'
Добавлено в версии 3.6: Добавлен аргумент timespec.
-
datetime.
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 < 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
объекты поддерживают сравнение 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()
не возвращаетNone
HH:MM:SS+HH:MM[:SS[.ffffff]]
, еслиmicrosecond
равно 0 иutcoffset()
не возвращаетNone
Дополнительный аргумент timespec указывает количество дополнительных компонентов времени для включения (по умолчанию -
'auto'
). Это может быть одно из следующих:'auto'
: то же, что и'seconds'
, еслиmicrosecond
0, то же, что и'microseconds'
иначе.'hours'
: включитьhour
в двухзначный форматHH
.'minutes'
: включитьhour
иminute
в форматеHH:MM
.'seconds'
: включитьhour
,minute
иsecond
в форматеHH:MM:SS
.'milliseconds'
: включить полный рабочий день, но усечь дробную вторую часть до миллисекунд. ФорматHH:MM:SS.sss
.'microseconds'
: включить полный рабочий день в форматеHH:MM:SS.ffffff
.
Примечание
Исключенные компоненты времени усекаются, а не округляются.
Будет поднято
ValueError
для недопустимого аргумента timespec.Пример:
>>> from datetime import time >>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes') '12:34' >>> dt = time(hour=12, minute=34, second=56, microsecond=0) >>> dt.isoformat(timespec='microseconds') '12:34:56.000000' >>> dt.isoformat(timespec='auto') '12:34:56'
Добавлено в версии 3.6: Добавлен аргумент timespec.
-
time.
__str__
()¶ Для времени t,
str(t)
эквивалентенt.isoformat()
.
-
time.
strftime
(format)¶ Возвращает строку, представляющей время, контролируемое явным форматом строки. Полный список директив форматирования см. в разделе strftime() и strptime() поведение.
-
time.
__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)
должен возвратить тот же результат для каждого
datetime
dt с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
кодов заменяется пустыми строками.Для знающего объекта:
%z
utcoffset()
преобразуется в строку формы±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 не високосный год. |