Руководство для начинающих по модулю времени Python

Руководство для начинающих по модулю времени Python

Модуль Pythontime предоставляет множество способов представления времени в коде, таких как объекты, числа и строки. Он также обеспечивает функциональность, отличную от представления времени, например, ожидание во время выполнения кода и измерение эффективности вашего кода.

В этой статье вы познакомитесь с наиболее часто используемыми функциями и объектами вtime.

К концу этой статьи вы сможете:

  • Основные концепцииUnderstand, лежащие в основе работы с датой и временем, такие как эпохи, часовые пояса и летнее время

  • Represent время в коде с использованием чисел с плавающей запятой, кортежей иstruct_time

  • Convert между разными представлениями времени

  • Suspend выполнение потока

  • Производительность кодаMeasure с использованиемperf_counter()

Вы начнете с изучения того, как вы можете использовать число с плавающей запятой для представления времени.

Free Bonus:Click here to get our free Python Cheat Sheet, который показывает вам основы Python 3, такие как работа с типами данных, словарями, списками и функциями Python.

Работа со временем Python с использованием секунд

Одним из способов управления концепцией времени Python в вашем приложении является использование числа с плавающей запятой, которое представляет количество секунд, прошедших с начала эры, то есть с определенной начальной точки.

Давайте углубимся в то, что это значит, почему это полезно и как вы можете использовать это для реализации логики, основанной на времени Python, в вашем приложении.

Эпоха

В предыдущем разделе вы узнали, что вы можете управлять временем Python с помощью числа с плавающей запятой, представляющего время, прошедшее с начала эры.

Merriam-Webster определяет эру как:

  • Фиксированный момент времени, с которого рассчитывается ряд лет

  • Система хронологической нотации, рассчитанная с заданной даты в качестве основы

Здесь важно понять, что при работе со временем Python вы учитываете период времени, определяемый отправной точкой. В вычислениях вы называете эту отправную точкуepoch.

Таким образом, эпоха является отправной точкой, с которой вы можете измерить течение времени.

Например, если вы определяете эпоху как полночь 1 января 1970 г. по всемирному координированному времени (эпоху, определенную в Windows и большинстве систем UNIX), вы можете представить полночь 2 января 1970 г. по всемирному координированному времени как86400 секунд с начала эпохи. .

Это потому, что есть 60 секунд в минуту, 60 минут в час и 24 часа в день. 2 января 1970 года по Гринвичу только один день после эпохи, поэтому вы можете применить базовую математику, чтобы получить такой результат:

>>>

>>> 60 * 60 * 24
86400

Также важно отметить, что вы все еще можете представлять время до эпохи. Количество секунд будет просто отрицательным.

Например, полночь 31 декабря 1969 г. по всемирному координированному времени (с использованием эпохи 1 января 1970 г.) можно представить как-86400 секунд.

Хотя 1 января 1970 года UTC является обычной эпохой, она не единственная, используемая в вычислительной технике. Фактически, разные операционные системы, файловые системы и API иногда используют разные эпохи.

Как вы видели ранее, системы UNIX определяют эпоху как 1 января 1970 года. Win32 API, с другой стороны, определяет эпоху какJanuary 1, 1601.

Вы можете использоватьtime.gmtime(), чтобы определить эпоху вашей системы:

>>>

>>> import time
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

Вы узнаете оgmtime() иstruct_time в ходе этой статьи. А пока просто знайте, что вы можете использоватьtime для определения эпохи с помощью этой функции.

Теперь, когда вы больше понимаете, как измерять время в секундах с помощью эпох, давайте взглянем на модуль Pythontime, чтобы узнать, какие функции он предлагает, которые помогут вам в этом.

Время Python в секундах как число с плавающей точкой

Во-первых,time.time() возвращает количество секунд, прошедших с эпохи. Возвращаемое значение представляет собой число с плавающей запятой для учета доли секунды:

>>>

>>> from time import time
>>> time()
1551143536.9323719

Число, которое вы получаете на своей машине, может сильно отличаться, потому что точка отсчета, которая считается эпохой, может сильно отличаться.

Further Reading: Python 3.7 представилtime_ns(), который возвращает целочисленное значение, представляющее то же время, прошедшее с эпохи, но в наносекундах, а не в секундах.

Измерение времени в секундах полезно по ряду причин:

  • Вы можете использовать float для вычисления разницы между двумя точками во времени.

  • Поплавок легко равенserializable, что означает, что он может быть сохранен для передачи данных и останется неизменным с другой стороны.

Однако иногда вы можете захотеть увидеть текущее время в виде строки. Для этого вы можете передать количество секунд, которое вы получаете отtime(), вtime.ctime().

Время Python в секундах как строка, представляющая местное время

Как вы видели ранее, вы можете захотеть преобразовать время Python, представленное как количество секунд, прошедших с эпохи, вstring. Вы можете сделать это с помощьюctime():

>>>

>>> from time import time, ctime
>>> t = time()
>>> ctime(t)
'Mon Feb 25 19:11:59 2019'

Здесь вы записали текущее время в секундах в переменнуюt, а затем передалиt в качестве аргумента функцииctime(), которая возвращает строковое представление того же времени.

Technical Detail: Аргумент, представляющий секунды с начала эпохи, является необязательным согласно определениюctime(). Если вы не передаете аргумент, тоctime() по умолчанию использует возвращаемое значениеtime(). Итак, вы могли бы упростить приведенный выше пример:

>>>

>>> from time import ctime
>>> ctime()
'Mon Feb 25 19:11:59 2019'

Строковое представление времени, также известное какtimestamp, возвращаемоеctime(), форматируется со следующей структурой:

  1. Day of the week:Mon (Monday)

  2. Month of the year:Feb (February)

  3. День месяца: 25

  4. Часы, минуты и секунды с использованием записи24-hour clock: 19:11:59

  5. Год: 2019

В предыдущем примере отображается метка времени определенного момента, снятого с компьютера в южно-центральном регионе США. Но, допустим, вы живете в Сиднее, Австралия, и в одно и то же время выполнили одну и ту же команду.

Вместо вышеприведенного вывода вы увидите следующее:

>>>

>>> from time import time, ctime
>>> t = time()
>>> ctime(t)
'Tue Feb 26 12:11:59 2019'

Обратите внимание, что части метки времениday of week,day of month иhour отличаются от первого примера.

Эти выходные данные отличаются, потому что метка времени, возвращаемаяctime(), зависит от вашего географического положения.

Note: Хотя понятие часовых поясов зависит от вашего физического местоположения, вы можете изменить его в настройках компьютера без фактического перемещения.

Представление времени, зависящее от вашего физического местоположения, называетсяlocal time и использует концепцию, называемуюtime zones.

Note: Поскольку местное время связано с вашим языковым стандартом, временные метки часто учитывают специфические для локали детали, такие как порядок элементов в строке и перевод сокращений дня и месяца. ctime() игнорирует эти детали.

Давайте углубимся в понятие часовых поясов, чтобы вы могли лучше понять представления времени Python.

Понимание часовых поясов

Часовой пояс - это регион мира, который соответствует стандартизированному времени. Часовые пояса определяются их смещением отCoordinated Universal Time (UTC) и, возможно, включением летнего времени (которое мы рассмотрим более подробно позже в этой статье).

Fun Fact: Если вы являетесь носителем английского языка, вам может быть интересно, почему сокращение для «всемирного координированного времени» - это UTC, а не более очевидное CUT. Однако, если вы являетесь носителем французского языка, вы бы назвали его «Temps Universel Coordonné», что предполагает другое сокращение: TUC.

В конечном счете,International Telecommunication Union and the International Astronomical Union compromised on UTC является официальным сокращением, поэтому, независимо от языка, сокращение будет одинаковым.

UTC и часовые пояса

UTC - это стандарт времени, по которому все мировые хронометражи синхронизируются (или координируются). Это не сам часовой пояс, а трансцендентный стандарт, определяющий, что такое часовые пояса.

Время UTC точно измеряется с помощьюastronomical time, относящегося к вращению Земли, иatomic clocks.

Часовые пояса тогда определяются их смещением от UTC. Например, в Северной и Южной Америке центральный часовой пояс (CT) отстает от UTC на пять или шесть часов и поэтому использует обозначение UTC-5: 00 или UTC-6: 00.

Сидней, Австралия, с другой стороны, принадлежит к восточному часовому поясу Австралии (AET), который на десять или одиннадцать часов опережает UTC (UTC + 10: 00 или UTC + 11: 00).

Эта разница (от UTC-6: 00 до UTC + 10: 00) является причиной различия, которое вы наблюдали в двух выходных данных изctime() в предыдущих примерах:

  • Центральное время (CT): 'Mon Feb 25 19:11:59 2019'

  • Восточное время Австралии (AET): 'Tue Feb 26 12:11:59 2019'

Это время составляет ровно шестнадцать часов, что согласуется с упомянутыми выше смещениями часовых поясов.

Вы можете задаться вопросом, почему КТ может быть на пять или шесть часов позже UTC или почему AET может быть на десять или одиннадцать часов вперед. Причина этого заключается в том, что некоторые районы мира, включая части этих часовых поясов, отмечают переход на летнее время.

Летнее время

В летние месяцы обычно большеdaylight hours, чем в зимние. Из-за этого в некоторых районах весной и летом отмечается переход на летнее время, чтобы лучше использовать эти дневные часы.

Для мест, где наблюдается летнее время, их часы будут прыгать вперед на один час в начале весны (фактически теряя час). Затем осенью часы будут сброшены на стандартное время.

Буквы S и D обозначают стандартное время и переход на летнее время в обозначениях часовых поясов:

  • Центральное стандартное время (CST)

  • Австралийское восточное летнее время (AEDT)

Когда вы представляете время как метки времени по местному времени, всегда важно учитывать, применимо ли летнее время или нет.

ctime() учитывает летнее время. Таким образом, разница выходных данных, указанная ранее, будет более точной, как показано ниже:

  • Центральное стандартное время (CST): 'Mon Feb 25 19:11:59 2019'

  • Восточное летнее время Австралии (AEDT): 'Tue Feb 26 12:11:59 2019'

Работа со временем Python с использованием структур данных

Теперь, когда у вас есть четкое представление о многих фундаментальных концепциях времени, включая эпохи, часовые пояса и всемирное координированное время, давайте рассмотрим другие способы представления времени с помощью модуля Pythontime.

Время Python как кортеж

Вместо использования числа для представления времени Python вы можете использовать другую примитивную структуру данных: atuple.

Кортеж позволяет вам легче управлять временем, абстрагируя некоторые данные и делая их более читабельными.

Когда вы представляете время как кортеж, каждый элемент в вашем кортеже соответствует определенному элементу времени:

  1. Year

  2. Месяц как целое число в диапазоне от 1 (январь) до 12 (декабрь)

  3. День месяца

  4. Час в виде целого числа в диапазоне от 0 (12 часов утра) до 23 часов (11 часов вечера)

  5. минут

  6. второй

  7. День недели в виде целого числа в диапазоне от 0 (понедельник) до 6 (воскресенье)

  8. День года

  9. Летнее время в виде целого числа со следующими значениями:

    • 1 - летнее время.

    • 0 - стандартное время.

    • -1 неизвестно.

Используя методы, которые вы уже изучили, вы можете представлять одно и то же время Python двумя разными способами:

>>>

>>> from time import time, ctime
>>> t = time()
>>> t
1551186415.360564
>>> ctime(t)
'Tue Feb 26 07:06:55 2019'

>>> time_tuple = (2019, 2, 26, 7, 6, 55, 1, 57, 0)

В этом случае иt, иtime_tuple представляют одно и то же время, но кортеж обеспечивает более читаемый интерфейс для работы с компонентами времени.

Technical Detail: На самом деле, если вы посмотрите на время Python, представленноеtime_tuple в секундах (что вы увидите, как это сделать позже в этой статье), вы увидите, что оно преобразуется в1551186415.0, а не1551186415.360564.

Это потому, что у кортежа нет способа представить доли секунды.

Хотя кортеж обеспечивает более управляемый интерфейс для работы с временем Python, существует еще лучший объект:struct_time.

Время Python как объект

Проблема с конструкцией кортежа состоит в том, что она по-прежнему выглядит как набор чисел, хотя она организована лучше, чем одно, основанное на секундах число.

struct_time предлагает решение этой проблемы, используяNamedTuple из модуля Pythoncollections, чтобы связать последовательность чисел кортежа с полезными идентификаторами:

>>>

>>> from time import struct_time
>>> time_tuple = (2019, 2, 26, 7, 6, 55, 1, 57, 0)
>>> time_obj = struct_time(time_tuple)
>>> time_obj
time.struct_time(tm_year=2019, tm_mon=2, tm_mday=26, tm_hour=7, tm_min=6, tm_sec=55, tm_wday=1, tm_yday=57, tm_isdst=0)

Technical Detail: Если вы переходите с другого языка, терминыstruct иobject могут противоречить друг другу.

В Python нет типа данныхstruct. Вместо этого все является объектом.

Однако имяstruct_time происходит отC-based time library, где тип данных на самом делеstruct.

Фактически, модульtime Python, которым являетсяimplemented in C, использует этотstruct напрямую, включая файл заголовкаtimes.h.

Теперь вы можете получить доступ к определенным элементамtime_obj, используя имя атрибута, а не индекс:

>>>

>>> day_of_year = time_obj.tm_yday
>>> day_of_year
57
>>> day_of_month = time_obj.tm_mday
>>> day_of_month
26

Помимо удобочитаемости и удобства использованияstruct_time, это также важно знать, потому что это тип возвращаемого значения многих функций в модуле Pythontime.

Преобразование времени Python в секундах в объект

Теперь, когда вы увидели три основных способа работы со временем Python, вы узнаете, как выполнять преобразование между различными типами данных времени.

Преобразование между типами данных времени зависит от того, указано ли время в формате UTC или по местному времени.

Всемирное координированное время (UTC)

Эпоха использует UTC для своего определения, а не часовой пояс. Поэтому количество секунд, прошедших с начала эпохи, не зависит от вашего географического положения.

Однако этого нельзя сказать оstruct_time. Объектное представление времени Python может принимать или не учитывать ваш часовой пояс.

Есть два способа преобразовать число с плавающей запятой, представляющее секунды, вstruct_time:

  1. UTC

  2. Местное время

Чтобы преобразовать плавающее время Python вstruct_time на основе UTC, модуль Pythontime предоставляет функцию под названиемgmtime().

Вы уже видели, какgmtime() использовался раньше в этой статье:

>>>

>>> import time
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

Вы использовали этот вызов, чтобы узнать эпоху вашей системы. Теперь у вас есть лучшая основа для понимания того, что на самом деле здесь происходит.

gmtime() преобразует количество секунд, прошедших с начала эпохи, вstruct_time в формате UTC. В этом случае вы передали0 как количество секунд, что означает, что вы пытаетесь найти саму эпоху в UTC.

Note: Обратите внимание, что атрибутtm_isdst установлен на0. Этот атрибут представляет, использует ли часовой пояс летнее время. UTC никогда не подписывается на DST, поэтому этот флаг всегда будет0 при использованииgmtime().

Как вы видели ранее,struct_time не может представлять дробные секунды, поэтомуgmtime() игнорирует дробные секунды в аргументе:

>>>

>>> import time
>>> time.gmtime(1.99)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=1, tm_wday=3, tm_yday=1, tm_isdst=0)

Обратите внимание, что хотя количество прошедших секунд было очень близко к2, доли секунды.99 просто игнорировались, как показаноtm_sec=1.

Параметрsecs дляgmtime() является необязательным, то есть вы можете вызыватьgmtime() без аргументов. Это обеспечит текущее время в UTC:

>>>

>>> import time
>>> time.gmtime()
time.struct_time(tm_year=2019, tm_mon=2, tm_mday=28, tm_hour=12, tm_min=57, tm_sec=24, tm_wday=3, tm_yday=59, tm_isdst=0)

Интересно, что в пределахtime для этой функции нет обратной. Вместо этого вам придется поискать в модуле Pythoncalendar функцию с именемtimegm():

>>>

>>> import calendar
>>> import time
>>> time.gmtime()
time.struct_time(tm_year=2019, tm_mon=2, tm_mday=28, tm_hour=13, tm_min=23, tm_sec=12, tm_wday=3, tm_yday=59, tm_isdst=0)
>>> calendar.timegm(time.gmtime())
1551360204

timegm() принимает кортеж (илиstruct_time, поскольку это подкласс кортежа) и возвращает соответствующее количество секунд с начала эпохи.

Historical Context: Если вас интересует, почемуtimegm() отсутствует вtime, вы можете просмотреть обсуждение вPython Issue 6280.

Короче говоря, он был первоначально добавлен вcalendar, потому чтоtime точно следует за библиотекой времени C (определенной вtime.h), которая не содержит функции сопоставления. Вышеупомянутая проблема предлагала идею перемещения или копированияtimegm() вtime.

Однако с развитием библиотекиdatetime, несоответствиями в пропатченной реализацииtime.timegm() и вопросом о том, как затем обрабатыватьcalendar.timegm(), разработчики отклонили патч, поощряя использованиеdatetime вместо этого.

Работа с UTC полезна в программировании, потому что это стандарт. Вам не нужно беспокоиться о летнем времени, часовом поясе или информации о локали.

Тем не менее, есть много случаев, когда вы хотите использовать местное время. Далее вы увидите, как конвертировать из секунд в местное время, чтобы вы могли сделать именно это.

Местное время

В вашем приложении вам может потребоваться работать по местному времени, а не по UTC. Модуль Pythontime предоставляет функцию для получения местного времени из количества секунд, прошедших с эпохиlocaltime().

Сигнатураlocaltime() похожа наgmtime() тем, что она принимает необязательный аргументsecs, который он использует для построенияstruct_time с использованием вашего местного часового пояса:

>>>

>>> import time
>>> time.time()
1551448206.86196
>>> time.localtime(1551448206.86196)
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=7, tm_min=50, tm_sec=6, tm_wday=4, tm_yday=60, tm_isdst=0)

Обратите внимание, чтоtm_isdst=0. Поскольку летнее время имеет значение для местного времени,tm_isdst будет меняться между0 и1 в зависимости от того, применимо ли летнее время в данное время. Начиная сtm_isdst=0, с 1 марта 2019 года летнее время не применяется.

В США в 2019 году переход на летнее время начинается 10 марта. Итак, чтобы проверить, правильно ли изменится флаг DST, вам нужно добавить 9 дней в секундах к аргументуsecs.

Чтобы вычислить это, вы берете количество секунд в дне (86 400) и умножаете это на 9 дней:

>>>

>>> new_secs = 1551448206.86196 + (86400 * 9)
>>> time.localtime(new_secs)
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=10, tm_hour=8, tm_min=50, tm_sec=6, tm_wday=6, tm_yday=69, tm_isdst=1)

Теперь вы увидите, чтоstruct_time показывает дату 10 марта 2019 г. сtm_isdst=1. Также обратите внимание, чтоtm_hour также перескочил на8 вместо7 в предыдущем примере из-за перехода на летнее время.

Начиная с Python 3.3,struct_time также включает два атрибута, которые полезны для определения часового поясаstruct_time:

  1. tm_zone

  2. tm_gmtoff

Сначала эти атрибуты зависели от платформы, но они были доступны на всех платформах начиная с Python 3.6.

Во-первых,tm_zone хранит местный часовой пояс:

>>>

>>> import time
>>> current_local = time.localtime()
>>> current_local.tm_zone
'CST'

Здесь вы можете видеть, чтоlocaltime() возвращаетstruct_time с часовым поясом, установленным наCST (центральное стандартное время).

Как вы видели ранее, вы также можете указать часовой пояс на основе двух частей информации: смещение UTC и летнее время (если применимо):

>>>

>>> import time
>>> current_local = time.localtime()
>>> current_local.tm_gmtoff
-21600
>>> current_local.tm_isdst
0

В этом случае вы можете видеть, чтоcurrent_local на21600 секунд отстает от GMT, что означает среднее время по Гринвичу. GMT - часовой пояс без смещения UTC: UTC ± 00: 00.

21600 секунд, разделенное на секунды в час (3600), означает, что времяcurrent_local равноGMT-06:00 (илиUTC-06:00).

Вы можете использовать смещение по Гринвичу плюс статус DST, чтобы сделать вывод, чтоcurrent_local равноUTC-06:00 в стандартное время, что соответствует стандартному часовому поясу Central.

Как иgmtime(), вы можете игнорировать аргументsecs при вызовеlocaltime(), и он вернет текущее местное время вstruct_time:

>>>

>>> import time
>>> time.localtime()
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=8, tm_min=34, tm_sec=28, tm_wday=4, tm_yday=60, tm_isdst=0)

В отличие отgmtime(), функция, обратнаяlocaltime(), существует в модуле Pythontime. Давайте посмотрим, как это работает.

Преобразование объекта местного времени в секунды

Вы уже видели, как преобразовать объект времени UTC в секунды с помощьюcalendar.timegm(). Чтобы перевести местное время в секунды, используйтеmktime().

mktime() требует, чтобы вы передали параметр с именемt, который принимает форму либо обычного кортежа из 9 элементов, либо объектаstruct_time, представляющего местное время:

>>>

>>> import time

>>> time_tuple = (2019, 3, 10, 8, 50, 6, 6, 69, 1)
>>> time.mktime(time_tuple)
1552225806.0

>>> time_struct = time.struct_time(time_tuple)
>>> time.mktime(time_struct)
1552225806.0

Важно помнить, чтоt должен быть кортежем, представляющим местное время, а не UTC:

>>>

>>> from time import gmtime, mktime

>>> # 1
>>> current_utc = time.gmtime()
>>> current_utc
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=14, tm_min=51, tm_sec=19, tm_wday=4, tm_yday=60, tm_isdst=0)

>>> # 2
>>> current_utc_secs = mktime(current_utc)
>>> current_utc_secs
1551473479.0

>>> # 3
>>> time.gmtime(current_utc_secs)
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=20, tm_min=51, tm_sec=19, tm_wday=4, tm_yday=60, tm_isdst=0)

Note: В этом примере предположим, что местное времяMarch 1, 2019 08:51:19 CST.

В этом примере показано, почему важно использоватьmktime() с местным временем, а не с UTC:

  1. gmtime() без аргументов возвращаетstruct_time с использованием UTC. current_utc показываетMarch 1, 2019 14:51:19 UTC. Это верно, потому чтоCST is UTC-06:00, поэтому UTC должно опережать местное время на 6 часов.

  2. mktime() пытается вернуть количество секунд, ожидая местного времени, но вместо этого вы передалиcurrent_utc. Итак, вместо того, чтобы понимать, чтоcurrent_utc - это время UTC, предполагается, что вы имели в видуMarch 1, 2019 14:51:19 CST.

  3. Затемgmtime() используется для преобразования этих секунд обратно в UTC, что приводит к несогласованности. Сейчас времяMarch 1, 2019 20:51:19 UTC. Причина этого расхождения в том, чтоmktime() ожидает местного времени. Таким образом, преобразование обратно в UTC добавляетanother 6 часов к местному времени.

Работа с часовыми поясами общеизвестно трудна, поэтому важно настроить себя на успех, понимая разницу между временем по Гринвичу и местным временем и функциями времени Python, которые имеют дело с каждым.

Преобразование объекта времени Python в строку

Хотя работать с кортежами - это весело, но иногда лучше всего работать со строками.

Строковые представления времени, также известные как метки времени, помогают сделать время более читабельным и могут быть особенно полезны для создания интуитивно понятных пользовательских интерфейсов.

Есть две функции Pythontime, которые вы используете для преобразования объектаtime.struct_time в строку:

  1. asctime()

  2. strftime()

Вы начнете с изучения `asctime () `.

asctime()

Вы используетеasctime() для преобразования кортежа времени илиstruct_time в метку времени:

>>>

>>> import time
>>> time.asctime(time.gmtime())
'Fri Mar  1 18:42:08 2019'
>>> time.asctime(time.localtime())
'Fri Mar  1 12:42:15 2019'

Иgmtime(), иlocaltime() возвращают экземплярыstruct_time для UTC и местного времени соответственно.

Вы можете использоватьasctime() для преобразованияstruct_time в метку времени. asctime() работает аналогичноctime(), о котором вы узнали ранее в этой статье, за исключением того, что вместо передачи числа с плавающей запятой вы передаете кортеж. Даже формат отметки времени одинаков между двумя функциями.

Как и дляctime(), параметр дляasctime() является необязательным. Если вы не передадите объект времени вasctime(), он будет использовать текущее местное время:

>>>

>>> import time
>>> time.asctime()
'Fri Mar  1 12:56:07 2019'

Как иctime(), он также игнорирует информацию о локали.

Один из самых больших недостатковasctime() - негибкость его формата. strftime() решает эту проблему, позволяя форматировать метки времени.

strftime()

Вы можете оказаться в ситуации, когда строковый формат изctime() иasctime() не подходит для вашего приложения. Вместо этого вы можете отформатировать строки так, чтобы они были более понятными для ваших пользователей.

Одним из примеров этого является, если вы хотите отобразить свое время в строке, которая принимает во внимание информацию о локали.

Для форматирования строк с заданным кортежем времениstruct_time или Python вы используетеstrftime(), что означает «время строкиformat».

strftime() принимает два аргумента:

  1. format определяет порядок и форму элементов времени в вашей строке.

  2. t - необязательный временной кортеж.

Для форматирования строки вы используетеdirectives. Директивы - это последовательности символов, которые начинаются с% и определяют конкретный элемент времени, например:

  • %d: День месяца

  • %m: Месяц года

  • %Y: Год

Например, вы можете вывести дату по вашему местному времени, используя стандартISO 8601 следующим образом:

>>>

>>> import time
>>> time.strftime('%Y-%m-%d', time.localtime())
'2019-03-01'

Further Reading: Хотя представление дат с использованием времени Python является полностью допустимым и допустимым, вам также следует рассмотреть возможность использования модуля Pythondatetime, который предоставляет ярлыки и более надежную структуру для совместной работы с датой и временем.

Например, вы можете упростить вывод даты в формате ISO 8601, используяdatetime:

>>>

>>> from datetime import date
>>> date(year=2019, month=3, day=1).isoformat()
'2019-03-01'

Как вы видели ранее, большим преимуществом использованияstrftime() по сравнению сasctime() является его способность отображать временные метки, использующие информацию, зависящую от локали.

Например, если вы хотите представить дату и время с учетом языкового стандарта, вы не можете использоватьasctime():

>>>

>>> from time import asctime
>>> asctime()
'Sat Mar  2 15:21:14 2019'

>>> import locale
>>> locale.setlocale(locale.LC_TIME, 'zh_HK')  # Chinese - Hong Kong
'zh_HK'
>>> asctime()
'Sat Mar  2 15:58:49 2019'

Обратите внимание, что даже после программного изменения языкового стандартаasctime() по-прежнему возвращает дату и время в том же формате, что и раньше.

Technical Detail:LC_TIME - это категория локали для форматирования даты и времени. Аргументlocale'zh_HK' может отличаться в зависимости от вашей системы.

Однако, когда вы используетеstrftime(), вы увидите, что он учитывает языковой стандарт:

>>>

>>> from time import strftime, localtime
>>> strftime('%c', localtime())
'Sat Mar  2 15:23:20 2019'

>>> import locale
>>> locale.setlocale(locale.LC_TIME, 'zh_HK')  # Chinese - Hong Kong
'zh_HK'
>>> strftime('%c', localtime())
'六  3/ 2 15:58:12 2019' 2019'

Здесь вы успешно использовали информацию о локали, потому что вы использовалиstrftime().

Note:%c - это директива для даты и времени, соответствующих локали.

Если временной кортеж не передан в параметрt, тоstrftime() будет использовать результатlocaltime() по умолчанию. Таким образом, вы можете упростить приведенные выше примеры, удалив необязательный второй аргумент:

>>>

>>> from time import strftime
>>> strftime('The current local datetime is: %c')
'The current local datetime is: Fri Mar  1 23:18:32 2019'

Здесь вы использовали время по умолчанию вместо того, чтобы передавать свое собственное в качестве аргумента. Также обратите внимание, что аргументformat может состоять из текста, отличного от директив форматирования.

Further Reading: Ознакомьтесь с этимlist of directives, доступным дляstrftime().

Модуль Pythontime также включает обратную операцию преобразования метки времени обратно в объектstruct_time.

Преобразование строки времени Python в объект

Когда вы работаете со строками, связанными с датой и временем, очень полезно преобразовать метку времени в объект времени.

Чтобы преобразовать строку времени вstruct_time, вы используетеstrptime(), что означает «строкаparse time»:

>>>

>>> from time import strptime
>>> strptime('2019-03-01', '%Y-%m-%d')
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=60, tm_isdst=-1)

Первым аргументомstrptime() должна быть метка времени, которую вы хотите преобразовать. Второй аргумент - этоformat, в котором находится метка времени.

Параметрformat является необязательным и по умолчанию равен'%a %b %d %H:%M:%S %Y'. Поэтому, если у вас есть метка времени в этом формате, вам не нужно передавать ее в качестве аргумента:

>>>

>>> strptime('Fri Mar 01 23:38:40 2019')
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=1, tm_hour=23, tm_min=38, tm_sec=40, tm_wday=4, tm_yday=60, tm_isdst=-1)

Посколькуstruct_time имеет 9 ключевых компонентов даты и времени,strptime() должен обеспечивать разумные значения по умолчанию для значений тех компонентов, которые он не может проанализировать изstring.

В предыдущих примерахtm_isdst=-1. Это означает, чтоstrptime() не может определить по метке времени, соответствует ли она летнему времени или нет.

Теперь вы знаете, как работать со временем и датой Python, используя модульtime различными способами. Однако есть и другие способы использованияtime, помимо простого создания объектов времени, получения строк времени Python и использования секунд, прошедших с эпохи.

Приостановка исполнения

Одна действительно полезная функция времени Python -sleep(), которая приостанавливает выполнение потока на указанное время.

Например, вы можете приостановить выполнение вашей программы на 10 секунд следующим образом:

>>>

>>> from time import sleep, strftime
>>> strftime('%c')
'Fri Mar  1 23:49:26 2019'
>>> sleep(10)
>>> strftime('%c')
'Fri Mar  1 23:49:36 2019'

Ваша программа напечатает первую отформатированную строкуdatetime, затем остановится на 10 секунд и, наконец, напечатает вторую отформатированную строкуdatetime.

Вы также можете передать доли секунды вsleep():

>>>

>>> from time import sleep
>>> sleep(0.5)

sleep() полезен для тестирования или для того, чтобы заставить вашу программу ждать по любой причине, но вы должны быть осторожны, чтобы не остановить свой производственный код, если у вас нет веской причины для этого.

До Python 3.5 сигнал, отправленный вашему процессу, мог прерватьsleep(). Однако в 3.5 и более поздних версияхsleep() всегда приостанавливает выполнение, по крайней мере, на указанное время, даже если процесс получает сигнал.

sleep() - это всего лишь одна функция времени Python, которая может помочь вам протестировать ваши программы и сделать их более надежными.

Измерение производительности

Вы можете использоватьtime для измерения производительности вашей программы.

Это можно сделать с помощьюperf_counter(), который, как следует из названия, обеспечивает счетчик производительности с высоким разрешением для измерения небольших расстояний во времени.

Чтобы использоватьperf_counter(), вы устанавливаете счетчик до того, как ваш код начнет выполнение, а также после его завершения:

>>>

>>> from time import perf_counter
>>> def longrunning_function():
...     for i in range(1, 11):
...         time.sleep(i / i ** 2)
...
>>> start = perf_counter()
>>> longrunning_function()
>>> end = perf_counter()
>>> execution_time = (end - start)
>>> execution_time
8.201258441999926

Во-первых,start фиксирует момент перед вызовом функции. end фиксирует момент после возврата из функции. Общее время выполнения функции заняло(end - start)с секунд.

Technical Detail: Python 3.7 представилperf_counter_ns(), который работает так же, какperf_counter(), но использует наносекунды вместо секунд.

perf_counter() (илиperf_counter_ns()) - наиболее точный способ измерить производительность вашего кода за одно выполнение. Однако, если вы пытаетесь точно измерить производительность фрагмента кода, я рекомендую использовать модульPython timeit.

timeit специализируется на многократном запуске кода, чтобы получить более точный анализ производительности и помочь вам избежать чрезмерного упрощения измерения времени, а также других распространенных ошибок.

Заключение

Поздравляем! Теперь у вас есть отличная основа для работы с датами и временем в Python.

Теперь вы можете:

  • Используйте число с плавающей запятой, представляющее секунды, прошедшие с начала эпохи, чтобы иметь дело со временем

  • Управляйте временем с помощью кортежей и объектовstruct_time

  • Преобразование между секундами, кортежами и строками меток времени

  • Приостановить выполнение потока Python

  • Измерьте производительность, используяperf_counter()

Кроме того, вы узнали некоторые фундаментальные понятия, относящиеся к дате и времени, такие как:

  • Эпохи

  • UTC

  • Часовые пояса

  • Летнее время

Теперь пришло время применить полученные знания о времени Python в реальных приложениях!

Дальнейшее чтение

Если вы хотите узнать больше об использовании даты и времени в Python, взгляните на следующие модули:

  • datetime: Более надежный модуль даты и времени в стандартной библиотеке Python.

  • timeit: Модуль для измерения производительности фрагментов кода

  • astropy: Более точные даты, используемые в астрономии