Python3 Дата и время

Программы на Python могут обрабатывать даты и время многими способами, и преобразование форматов даты является распространённой функцией.

Python предоставляет модули time и calendar, которые можно использовать для форматирования дат и времени.

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

Каждая метка времени выражается как количество времени, прошедшего с полуночи (эпохи) 1 января 1970 года.

В модуле time Python есть много функций, которые могут преобразовывать распространённые форматы даты. Например, функция time.time() используется для получения текущей метки времени, как в примере ниже:

Примеры

#!/usr/bin/python3

import time  # импорт модуля time

ticks = time.time()
print ("Текущая метка времени:", ticks)

Вывод приведенного выше примера:

当前时间戳为: 1459996086.7115328

Единицы временных меток лучше всего подходят для арифметики с датами. Однако даты до 1970 года нельзя представить таким способом. Даты слишком далеко в будущем также невозможны, поскольку UNIX и Windows поддерживают только до 2038 года.



Что такое кортеж времени?

Многие функции Python обрабатывают время, используя кортеж из 9 групп чисел:

Нет.ПолеЗначение
04-значный год2008
1monthот 1 до 12
2dayот 1 до 31
3Часот 0 до 23
4Минутаот 0 до 59
5secondот 0 до 61 (60 или 61 — високосные секунды)
6День неделиот 0 до 6 (0 — понедельник)
7День года1 до 366 (юлианский календарь)
8Летнее время-1, 0, 1, -1 — это флаг, определяющий, действует ли летнее время

Выше приведён кортеж struct_time. Эта структура имеет следующие атрибуты:

Нет.AttributeЗначение
0tm_year2008
1tm_monот 1 до 12
2tm_mdayот 1 до 31
3tm_hourот 0 до 23
4tm_minот 0 до 59
5tm_secот 0 до 61 (60 или 61 — високосные секунды)
6tm_wdayот 0 до 6 (0 — понедельник)
7tm_ydayДень года, от 1 до 366
8tm_isdstЯвляется ли время летним, значения: 1 (летнее время), 0 (не летнее время), -1 (неизвестно), по умолчанию -1


Получить текущее время

Чтобы преобразовать отметку времени, возвращающую число с плавающей запятой, в кортеж времени, просто передайте число с плавающей запятой таким функциям, как localtime.

#!/usr/bin/python3

import time

localtime = time.localtime(time.time())
print ("本地时间为 :", localtime)

Вывод приведенного выше примера:

本地时间为 : time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7, tm_hour=10, tm_min=28, tm_sec=49, tm_wday=3, tm_yday=98, tm_isdst=0)


Получить форматированное время

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

#!/usr/bin/python3

import time

localtime = time.asctime( time.localtime(time.time()) )
print ("本地时间为 :", localtime)

Вывод приведенного выше примера:

本地时间为 : Thu Apr  7 10:29:13 2016

Форматирование дат

Мы можем использовать метод strftime модуля time для форматирования дат:

time.strftime(format[, t])

Примеры

#!/usr/bin/python3

import time

# Форматировать в вид 2016-03-20 11:45:39
print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

# Форматировать в вид Sat Mar 28 22:24:24 2016
print (time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))
 
# Преобразовать строку формата в отметку времени
a = "Sat Mar 28 22:24:24 2016"
print (time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y")))

Вывод приведенного выше примера:

2016-04-07 10:29:46
Thu Apr 07 10:29:46 2016
1459175064.0

Символы форматирования времени и даты в Python:

  • %y Двузначное представление года (00-99)
  • %Y Четырёхзначное представление года (000-9999)
  • %m Месяц (01-12)
  • %d День месяца (0-31)
  • %H Часы в 24-часовом формате (0-23)
  • %I Часы в 12-часовом формате (01-12)
  • %M Минуты (00-59)
  • %S Секунды (00-59)
  • %a Локальное сокращённое название дня недели
  • %A Локальное полное название дня недели
  • %b Локальное сокращённое название месяца
  • %B Локальное полное название месяца
  • %c Локальное представление даты и времени
  • %j День года (001-366)
  • %p Локальный эквивалент A.M. или P.M.
  • %U Номер недели в году (00-53), воскресенье — начало недели
  • %w День недели (0-6), воскресенье — начало недели
  • %W Номер недели в году (00-53), понедельник — начало недели
  • %x Локальное представление даты
  • %X Локальное представление времени
  • %Z Название текущего часового пояса
  • %% Сам символ процента

Получить календарь на месяц

Модуль Calendar имеет широкий набор методов для обработки годовых и месячных календарей, например печати календаря на месяц:

Примеры

#!/usr/bin/python3

import calendar

cal = calendar.month(2016, 1)
print ("Далее выводится календарь на январь 2016:")
print (cal)

Вывод приведенного выше примера:

以下输出2016年1月份的日历:
    January 2016
Mo Tu We Th Fr Sa Su
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31


Модуль Time

Модуль Time содержит следующие встроенные функции как для обработки времени, так и для преобразования форматов времени:

Нет.Функция и описаниеПримеры
1time.altzone
Возвращает смещение в секундах для зон летнего времени к западу от Гринвича. Если регион находится к востоку от Гринвича, возвращается отрицательное значение (например, Западная Европа, включая Великобританию). Доступно только в регионах, где включён переход на летнее время.

В следующем примере демонстрируется использование функции altzone():

>>> import time
>>> print ("time.altzone %d " % time.altzone)
time.altzone -28800 
2time.asctime([tupletime])
Принимает кортеж времени и возвращает читаемую строку из 24 символов в формате "Tue Dec 11 18:07:14 2008" (вторник, 11 декабря 2008 г., 18:07:14).

Следующий пример демонстрирует использование функции asctime():

>>> import time
>>> t = time.localtime()
>>> print ("time.asctime(t): %s " % time.asctime(t))
time.asctime(t): Thu Apr  7 10:36:20 2016 
3time.clock()
Возвращает текущее процессорное время в секундах с плавающей точкой. Используется для измерения времени выполнения различных программ и является более полезным, чем time.time().

Примеры

Поскольку этот метод зависит от операционной системы, он не рекомендуется после Python 3.3 и был удалён в версии 3.8; вместо него следует использовать следующие две функции.

time.perf_counter()  # 返回系统运行时间
time.process_time()  # 返回进程运行时间
4time.ctime([secs])
Его действие эквивалентно asctime(localtime(secs)); если аргумент не задан, оно эквивалентно asctime().

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

>>> import time
>>> print ("time.ctime() : %s" % time.ctime())
time.ctime() : Thu Apr  7 10:51:58 2016
5time.gmtime([secs])
Принимает временную метку (секунды с плавающей точкой, прошедшие с начала эпохи 1970 года) и возвращает кортеж времени t по среднему времени по Гринвичу. Примечание: t.tm_isdst всегда равен 0.

Следующий пример демонстрирует использование функции gmtime():

>>> import time
>>> print ("gmtime :", time.gmtime(1455508609.34375))
gmtime : time.struct_time(tm_year=2016, tm_mon=2, tm_mday=15, tm_hour=3, tm_min=56, tm_sec=49, tm_wday=0, tm_yday=46, tm_isdst=0)
6time.localtime([secs]
Принимает временную метку (секунды с плавающей точкой, прошедшие с начала эпохи 1970 года) и возвращает кортеж времени t в местном времени (t.tm_isdst может быть 0 или 1, в зависимости от того, действует ли в это время в данной местности переход на летнее время).

Следующий пример демонстрирует использование функции localtime():

>>> import time
>>> print ("localtime(): ", time.localtime(1455508609.34375))
localtime():  time.struct_time(tm_year=2016, tm_mon=2, tm_mday=15, tm_hour=11, tm_min=56, tm_sec=49, tm_wday=0, tm_yday=46, tm_isdst=0)
7time.mktime(tupletime)
Принимает кортеж времени и возвращает временную метку (секунды с плавающей точкой, прошедшие с начала эпохи 1970 года).
Примеры
8time.sleep(secs)
Приостанавливает выполнение вызывающего потока, где secs обозначает секунды.

В следующем примере демонстрируется использование функции sleep():

#!/usr/bin/python3
import time

print ("Start : %s" % time.ctime())
time.sleep( 5 )
print ("End : %s" % time.ctime())
9time.strftime(fmt[,tupletime])
Принимает кортеж времени и возвращает локальное время в виде читаемой строки, формат которой определяется fmt.

Следующий пример демонстрирует использование функции strftime():

>>> import time
>>> print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
2016-04-07 11:18:05
10time.strptime(str,fmt='%a %b %d %H:%M:%S %Y')
Разбирает строку времени в кортеж времени в соответствии с форматом fmt.

В следующем примере демонстрируется использование функции strptime():

>>> import time
>>> struct_time = time.strptime("30 Nov 00", "%d %b %y")
>>> print ("返回元组: ", struct_time)
返回元组:  time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)
11time.time( )
Возвращает временную метку текущего времени (секунды с плавающей запятой, прошедшие с эпохи 1970 года).

В следующем примере демонстрируется использование функции time():

>>> import time
>>> print(time.time())
1459999336.1963577
12time.tzset()
Повторно инициализирует настройки, связанные со временем, в соответствии с переменной среды TZ.
Примеры
13 time.perf_counter()
Возвращает точное время таймера (время работы системы), включая время сна всей системы. Поскольку точка отсчёта возвращаемого значения не определена, допустима только разница между результатами последовательных вызовов.
Примеры
14 time.process_time()
Возвращает общее время ЦП, затраченное текущим процессом, не включая время сна. Поскольку точка отсчёта возвращаемого значения не определена, допустима только разница между результатами последовательных вызовов.
 

Модуль Time содержит следующие 2 очень важных атрибута:

Нет.Атрибут и описание
1time.timezone
Атрибут time.timezone — это смещение в секундах местного часового пояса (когда летнее время не действует) относительно Гринвича (>0, Америка; <=0 большая часть Европы, Азии, Африки).
2time.tzname
Атрибут time.tzname содержит пару строк, которые различаются в зависимости от ситуации: название местного часового пояса с летним временем и без него.


Модуль calendar

Все функции в этом модуле связаны с календарём, например вывод символьного календаря на месяц.

По умолчанию первый день недели — понедельник, а последний — воскресенье. Чтобы изменить эту настройку, вызовите функцию calendar.setfirstweekday(). Модуль включает следующие встроенные функции:

Нет.Функция и описание
1calendar.calendar(year,w=2,l=1,c=6)
Возвращает календарь на год в формате многострочной строки, с 3 месяцами в строке и расстоянием между интервалами c. Ширина ежедневного интервала — w символов. Длина каждой строки составляет21* W+18+2* C。lЭто число строк в неделю.
2calendar.firstweekday( )
Возвращает текущую настройку для начального дня недели. По умолчанию, когда модуль calendar впервые загружается, он возвращает 0, т. е. понедельник.
3calendar.isleap(year)

Возвращает True, если год високосный, иначе False.

>>> import calendar
>>> print(calendar.isleap(2000))
True
>>> print(calendar.isleap(1900))
False
4calendar.leapdays(y1,y2)
Возвращает общее количество високосных лет между двумя годами Y1 и Y2.
5calendar.month(year,month,w=2,l=1)
Возвращает календарь для месяца month года year в формате многострочной строки, с двумя строками заголовка, по одной неделе в строке. Ширина ежедневного интервала — w символов. Длина каждой строки — 7*w+6. l — количество строк в неделю.
6calendar.monthcalendar(year,month)
Возвращает одноуровневый вложенный список целых чисел. Каждый подсписок содержит целые числа, представляющие одну неделю. Даты вне месяца month года year устанавливаются в 0; даты внутри диапазона представлены днём месяца, начиная с 1.
7calendar.monthrange(year,month)

Возвращает два целых числа. Первое — день недели, с которого начинается месяц, а второе — количество дней в месяце. Дни недели нумеруются от 0 (понедельник) до 6 (воскресенье).

>>> import calendar
>>> calendar.monthrange(2014, 11)
(5, 30)

(5, 30) Пояснение: 5 означает, что первый день ноября 2014 года — суббота, а 30 означает, что в ноябре 2014 года всего 30 дней.

8calendar.prcal(year, w=0, l=0, c=6, m=3)
Эквивалентно print (calendar.calendar(year, w=0, l=0, c=6, m=3)).
9calendar.prmonth(theyear, themonth, w=0, l=0)
Эквивалентноprint(calendar.month(theyear, themonth, w=0, l=0))。
10calendar.setfirstweekday(weekday)
Задаёт код первого дня каждой недели. От 0 (понедельник) до 6 (воскресенье).
11calendar.timegm(tupletime)
Противоположность time.gmtime: принимает кортеж времени и возвращает временную метку этого момента (секунды с плавающей запятой с начала эпохи 1970 года).
12calendar.weekday(year,month,day)
Возвращает код дня недели для заданной даты. От 0 (понедельник) до 6 (воскресенье). Месяц — от 1 (января) до 12 (декабря).


Другие связанные модули и функции

В Python другие модули для работы с датами и временем включают:

Другие расширения