Python3 Дата и время
Программы на Python могут обрабатывать даты и время многими способами, и преобразование форматов даты является распространённой функцией.
Python предоставляет модули time и calendar, которые можно использовать для форматирования дат и времени.
Интервалы времени представляют собой десятичные числа с плавающей запятой в секундах.
Каждая метка времени выражается как количество времени, прошедшего с полуночи (эпохи) 1 января 1970 года.
В модуле time Python есть много функций, которые могут преобразовывать распространённые форматы даты. Например, функция time.time() используется для получения текущей метки времени, как в примере ниже:
Примеры
import time # импорт модуля time
ticks = time.time()
print ("Текущая метка времени:", ticks)
Вывод приведенного выше примера:
当前时间戳为: 1459996086.7115328
Единицы временных меток лучше всего подходят для арифметики с датами. Однако даты до 1970 года нельзя представить таким способом. Даты слишком далеко в будущем также невозможны, поскольку UNIX и Windows поддерживают только до 2038 года.
Что такое кортеж времени?
Многие функции Python обрабатывают время, используя кортеж из 9 групп чисел:
| Нет. | Поле | Значение |
|---|---|---|
| 0 | 4-значный год | 2008 |
| 1 | month | от 1 до 12 |
| 2 | day | от 1 до 31 |
| 3 | Час | от 0 до 23 |
| 4 | Минута | от 0 до 59 |
| 5 | second | от 0 до 61 (60 или 61 — високосные секунды) |
| 6 | День недели | от 0 до 6 (0 — понедельник) |
| 7 | День года | 1 до 366 (юлианский календарь) |
| 8 | Летнее время | -1, 0, 1, -1 — это флаг, определяющий, действует ли летнее время |
Выше приведён кортеж struct_time. Эта структура имеет следующие атрибуты:
| Нет. | Attribute | Значение |
|---|---|---|
| 0 | tm_year | 2008 |
| 1 | tm_mon | от 1 до 12 |
| 2 | tm_mday | от 1 до 31 |
| 3 | tm_hour | от 0 до 23 |
| 4 | tm_min | от 0 до 59 |
| 5 | tm_sec | от 0 до 61 (60 или 61 — високосные секунды) |
| 6 | tm_wday | от 0 до 6 (0 — понедельник) |
| 7 | tm_yday | День года, от 1 до 366 |
| 8 | tm_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])
Примеры
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 имеет широкий набор методов для обработки годовых и месячных календарей, например печати календаря на месяц:
Примеры
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 содержит следующие встроенные функции как для обработки времени, так и для преобразования форматов времени:
| Нет. | Функция и описание | Примеры |
|---|---|---|
| 1 | time.altzone Возвращает смещение в секундах для зон летнего времени к западу от Гринвича. Если регион находится к востоку от Гринвича, возвращается отрицательное значение (например, Западная Европа, включая Великобританию). Доступно только в регионах, где включён переход на летнее время. |
В следующем примере демонстрируется использование функции altzone():
>>> import time
>>> print ("time.altzone %d " % time.altzone)
time.altzone -28800
|
| 2 | time.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
|
| 3 | time.clock() Возвращает текущее процессорное время в секундах с плавающей точкой. Используется для измерения времени выполнения различных программ и является более полезным, чем time.time(). |
Поскольку этот метод зависит от операционной системы, он не рекомендуется после Python 3.3 и был удалён в версии 3.8; вместо него следует использовать следующие две функции. time.perf_counter() # 返回系统运行时间 time.process_time() # 返回进程运行时间 |
| 4 | time.ctime([secs]) Его действие эквивалентно asctime(localtime(secs)); если аргумент не задан, оно эквивалентно asctime(). |
Следующий пример демонстрирует использование функции ctime():
>>> import time
>>> print ("time.ctime() : %s" % time.ctime())
time.ctime() : Thu Apr 7 10:51:58 2016
|
| 5 | time.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)
|
| 6 | time.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)
|
| 7 | time.mktime(tupletime) Принимает кортеж времени и возвращает временную метку (секунды с плавающей точкой, прошедшие с начала эпохи 1970 года). | Примеры |
| 8 | time.sleep(secs) Приостанавливает выполнение вызывающего потока, где secs обозначает секунды. |
В следующем примере демонстрируется использование функции sleep():
#!/usr/bin/python3
import time
print ("Start : %s" % time.ctime())
time.sleep( 5 )
print ("End : %s" % time.ctime())
|
| 9 | time.strftime(fmt[,tupletime]) Принимает кортеж времени и возвращает локальное время в виде читаемой строки, формат которой определяется fmt. |
Следующий пример демонстрирует использование функции strftime():
>>> import time
>>> print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
2016-04-07 11:18:05
|
| 10 | time.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)
|
| 11 | time.time( ) Возвращает временную метку текущего времени (секунды с плавающей запятой, прошедшие с эпохи 1970 года). |
В следующем примере демонстрируется использование функции time(): >>> import time >>> print(time.time()) 1459999336.1963577 |
| 12 | time.tzset() Повторно инициализирует настройки, связанные со временем, в соответствии с переменной среды TZ. | Примеры |
| 13 |
time.perf_counter() Возвращает точное время таймера (время работы системы), включая время сна всей системы. Поскольку точка отсчёта возвращаемого значения не определена, допустима только разница между результатами последовательных вызовов. | Примеры |
| 14 |
time.process_time() Возвращает общее время ЦП, затраченное текущим процессом, не включая время сна. Поскольку точка отсчёта возвращаемого значения не определена, допустима только разница между результатами последовательных вызовов. |
Модуль Time содержит следующие 2 очень важных атрибута:
| Нет. | Атрибут и описание |
|---|---|
| 1 | time.timezone Атрибут time.timezone — это смещение в секундах местного часового пояса (когда летнее время не действует) относительно Гринвича (>0, Америка; <=0 большая часть Европы, Азии, Африки). |
| 2 | time.tzname Атрибут time.tzname содержит пару строк, которые различаются в зависимости от ситуации: название местного часового пояса с летним временем и без него. |
Модуль calendar
Все функции в этом модуле связаны с календарём, например вывод символьного календаря на месяц.
По умолчанию первый день недели — понедельник, а последний — воскресенье. Чтобы изменить эту настройку, вызовите функцию calendar.setfirstweekday(). Модуль включает следующие встроенные функции:
| Нет. | Функция и описание |
|---|---|
| 1 | calendar.calendar(year,w=2,l=1,c=6) Возвращает календарь на год в формате многострочной строки, с 3 месяцами в строке и расстоянием между интервалами c. Ширина ежедневного интервала — w символов. Длина каждой строки составляет21* W+18+2* C。lЭто число строк в неделю. |
| 2 | calendar.firstweekday( ) Возвращает текущую настройку для начального дня недели. По умолчанию, когда модуль calendar впервые загружается, он возвращает 0, т. е. понедельник. |
| 3 | calendar.isleap(year) Возвращает True, если год високосный, иначе False. >>> import calendar >>> print(calendar.isleap(2000)) True >>> print(calendar.isleap(1900)) False |
| 4 | calendar.leapdays(y1,y2) Возвращает общее количество високосных лет между двумя годами Y1 и Y2. |
| 5 | calendar.month(year,month,w=2,l=1) Возвращает календарь для месяца month года year в формате многострочной строки, с двумя строками заголовка, по одной неделе в строке. Ширина ежедневного интервала — w символов. Длина каждой строки — 7*w+6. l — количество строк в неделю. |
| 6 | calendar.monthcalendar(year,month) Возвращает одноуровневый вложенный список целых чисел. Каждый подсписок содержит целые числа, представляющие одну неделю. Даты вне месяца month года year устанавливаются в 0; даты внутри диапазона представлены днём месяца, начиная с 1. |
| 7 | calendar.monthrange(year,month) Возвращает два целых числа. Первое — день недели, с которого начинается месяц, а второе — количество дней в месяце. Дни недели нумеруются от 0 (понедельник) до 6 (воскресенье). >>> import calendar >>> calendar.monthrange(2014, 11) (5, 30) (5, 30) Пояснение: 5 означает, что первый день ноября 2014 года — суббота, а 30 означает, что в ноябре 2014 года всего 30 дней. |
| 8 | calendar.prcal(year, w=0, l=0, c=6, m=3) Эквивалентно print (calendar.calendar(year, w=0, l=0, c=6, m=3)). |
| 9 | calendar.prmonth(theyear, themonth, w=0, l=0) Эквивалентноprint(calendar.month(theyear, themonth, w=0, l=0))。 |
| 10 | calendar.setfirstweekday(weekday) Задаёт код первого дня каждой недели. От 0 (понедельник) до 6 (воскресенье). |
| 11 | calendar.timegm(tupletime) Противоположность time.gmtime: принимает кортеж времени и возвращает временную метку этого момента (секунды с плавающей запятой с начала эпохи 1970 года). |
| 12 | calendar.weekday(year,month,day) Возвращает код дня недели для заданной даты. От 0 (понедельник) до 6 (воскресенье). Месяц — от 1 (января) до 12 (декабря). |
Другие связанные модули и функции
В Python другие модули для работы с датами и временем включают:
Другие расширения