ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов
Скачать 7.92 Mb.
|
datetime — позволяет манипулировать датой и временем. Например, производить арифметические операции, сравнивать даты, выводить дату и время в различных форма- тах и др.; calendar — позволяет вывести календарь в виде простого текста или в HTML-формате; timeit — позволяет измерить время выполнения небольших фрагментов кода с целью оптимизации программы. 10.1. Получение текущих даты и времени Получить текущие дату и время позволяют следующие функции из модуля time : time() — возвращает вещественное число, представляющее количество секунд, про- шедшее с начала эпохи (обычно с 1 января 1970 г.): >>> import time # Подключаем модуль time >>> time.time() # Получаем количество секунд 1511273856.8787858 gmtime([<Количество секунд>]) — возвращает объект struct_time , представляющий универсальное время (UTC). Если параметр не указан, возвращается текущее время. Если параметр указан, время будет не текущим, а соответствующим количеству секунд, прошедших с начала эпохи: >>> 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) >>> time.gmtime() # Текущая дата и время time.struct_time(tm_year=2017, tm_mon=11, tm_mday=21, tm_hour=14, tm_min=17, tm_sec=55, tm_wday=1, tm_yday=325, tm_isdst=0) >>> time.gmtime(1511273856.0) # Дата 21-11-2017 time.struct_time(tm_year=2017, tm_mon=11, tm_mday=21, tm_hour=14, tm_min=17, tm_sec=36, tm_wday=1, tm_yday=325, tm_isdst=0) Глава 10. Работа с датой и временем 185 Получить значение конкретного атрибута можно, указав его название или индекс внутри объекта: >>> d = time.gmtime() >>> d.tm_year, d[0] (2017, 2017) >>> tuple(d) # Преобразование в кортеж (2017, 11, 21, 14, 19, 34, 1, 325, 0) localtime([<Количество секунд>]) — возвращает объект struct_time , представляющий локальное время. Если параметр не указан, возвращается текущее время. Если параметр указан, время будет не текущим, а соответствующим количеству секунд, прошедших с начала эпохи: >>> time.localtime() # Текущая дата и время time.struct_time(tm_year=2017, tm_mon=11, tm_mday=21, tm_hour=17, tm_min=20, tm_sec=4, tm_wday=1, tm_yday=325, tm_isdst=0) >>> time.localtime(1511273856.0) # Дата 21-11-2017 time.struct_time(tm_year=2017, tm_mon=11, tm_mday=21, tm_hour=17, tm_min=17, tm_sec=36, tm_wday=1, tm_yday=325, tm_isdst=0) mktime(<Объект struct_time>) — возвращает вещественное число, представляющее ко- личество секунд, прошедших с начала эпохи. В качестве параметра указывается объект struct_time или кортеж из девяти элементов. Если указанная дата некорректна, возбуж- дается исключение OverflowError : >>> d = time.localtime(1511273856.0) >>> time.mktime(d) 1511273856.0 >>> tuple(time.localtime(1511273856.0)) (2017, 11, 21, 17, 17, 36, 1, 325, 0) >>> time.mktime((2017, 11, 21, 17, 17, 36, 1, 325, 0)) 1511273856.0 >>> time.mktime((1940, 0, 31, 5, 23, 43, 5, 31, 0)) ... Фрагмент опущен ... OverflowError: mktime argument out of range Объект struct_time , возвращаемый функциями gmtime() и localtime() , содержит следую- щие атрибуты (указаны тройки вида «имя атрибута — индекс — описание»): tm_year — 0 — год; tm_mon — 1 — месяц (число от 1 до 12 ); tm_mday — 2 — день месяца (число от 1 до 31 ); tm_hour — 3 — час (число от 0 до 23 ); tm_min — 4 — минуты (число от 0 до 59 ); tm_sec — 5 — секунды (число от 0 до 59 , изредка до 61 ); tm_wday — 6 — день недели (число от 0 для понедельника до 6 для воскресенья); tm_yday — 7 — количество дней, прошедшее с начала года (число от 1 до 366 ); tm_isdst — 8 — флаг коррекции летнего времени (значения 0 , 1 или –1 ). Выведем текущие дату и время таким образом, чтобы день недели и месяц были написаны по-русски (листинг 10.1). 186 Часть I. Основы языка Python Листинг 10.1. Вывод текущих даты и времени # -*- coding: utf-8 -*- import time # Подключаем модуль time d = [ "понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье" ] m = [ "", "января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря" ] t = time.localtime() # Получаем текущее время print( "Сегодня:\n%s %s %s %s %02d:%02d:%02d\n%02d.%02d.%02d" % ( d[t[6]], t[2], m[t[1]], t[0], t[3], t[4], t[5], t[2], t[1], t[0] ) ) input() Примерный результат выполнения: Сегодня: вторник 21 ноября 2017 17:20:04 21.11.2017 10.2. Форматирование даты и времени Форматирование даты и времени выполняют следующие функции из модуля time : strftime(<Строка формата>[, <Объект struct_time>]) — возвращает строковое пред- ставление даты в соответствии со строкой формата. Если второй параметр не указан, бу- дут выведены текущие дата и время. Если во втором параметре указан объект struct_time или кортеж из девяти элементов, дата будет соответствовать указанному значению. Функция зависит от настройки локали: >>> import time >>> time.strftime("%d.%m.%Y") # Форматирование даты '21.11.2017' >>> time.strftime("%H:%M:%S") # Форматирование времени '17:23:27' >>> time.strftime("%d.%m.%Y", time.localtime(1321954972.0)) '22.11.2011' strptime(<Строка с датой>[, <Строка формата>]) — разбирает строку, указанную в первом параметре, в соответствии со строкой формата. Возвращает объект struct_time Если строка не соответствует формату, возбуждается исключение ValueError . Если строка формата не указана, используется строка "%a %b %d %H:%M:%S %Y" . Функция учи- тывает текущую локаль: >>> time.strptime("Tue Nov 21 17:34:22 2017") time.struct_time(tm_year=2017, tm_mon=11, tm_mday=21, tm_hour=17, tm_min=34, tm_sec=22, tm_wday=1, tm_yday=325, tm_isdst=-1) >>> time.strptime("21.11.2017", "%d.%m.%Y") time.struct_time(tm_year=2017, tm_mon=11, tm_mday=21, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=325, tm_isdst=-1) >>> time.strptime("21-11-2017", "%d.%m.%Y") ... Фрагмент опущен ... ValueError: time data '21-11-2017' does not match format '%d.%m.%Y' Глава 10. Работа с датой и временем 187 asctime([<Объект struct_time>]) — возвращает строку формата "%a %b %d %H:%M:%S %Y" . Если параметр не указан, будут выведены текущие дата и время. Если в параметре указан объект struct_time или кортеж из девяти элементов, то дата будет соответство- вать указанному значению: >>> time.asctime() # Текущая дата 'Tue Nov 21 17:34:45 2017' >>> time.asctime(time.localtime(1321954972.0)) # Дата в прошлом 'Tue Nov 22 12:42:52 2011' ctime([<Количество секунд>]) — функция аналогична asctime() , но в качестве пара- метра принимает не объект struct_time , а количество секунд, прошедших с начала эпохи: >>> time.ctime() # Текущая дата 'Tue Nov 21 17:35:37 2017' >>> time.ctime(1321954972.0) # Дата в прошлом 'Tue Nov 22 12:42:52 2011' В параметре <Строка формата> в функциях strftime() и strptime() могут быть использова- ны следующие комбинации специальных символов: %y — год из двух цифр (от "00" до "99" ); %Y — год из четырех цифр (например, "2011" ); %m — номер месяца с предваряющим нулем (от "01" до "12" ); %b — аббревиатура месяца в зависимости от настроек локали (например, "янв" для января); %B — название месяца в зависимости от настроек локали (например, "Январь" ); %d — номер дня в месяце с предваряющим нулем (от "01" до "31" ); %j — день с начала года (от "001" до "366" ); %U — номер недели в году (от "00" до "53" ). Неделя начинается с воскресенья. Все дни с начала года до первого воскресенья относятся к неделе с номером 0 ; %W — номер недели в году (от "00" до "53" ). Неделя начинается с понедельника. Все дни с начала года до первого понедельника относятся к неделе с номером 0 ; %w — номер дня недели ( "0" — для воскресенья, "6" — для субботы); %a — аббревиатура дня недели в зависимости от настроек локали (например, "Пн" для понедельника); %A — название дня недели в зависимости от настроек локали (например, "понедельник" ); %H — часы в 24-часовом формате (от "00" до "23" ); %I — часы в 12-часовом формате (от "01" до "12" ); %M — минуты (от "00" до "59" ); %S — секунды (от "00" до "59" , изредка до "61" ); %p — эквивалент значений AM и PM в текущей локали; %c — представление даты и времени в текущей локали; %x — представление даты в текущей локали; %X — представление времени в текущей локали: 188 Часть I. Основы языка Python >>> import locale >>> locale.setlocale(locale.LC_ALL, "Russian_Russia.1251") 'Russian_Russia.1251' >>> print(time.strftime("%x")) # Представление даты 21.11.2017 >>> print(time.strftime("%X")) # Представление времени 17:37:00 >>> print(time.strftime("%c")) # Дата и время 21.11.2017 17:37:14 %Z — название часового пояса или пустая строка (например, "Московское время" , "UTC" ); %% — символ "%" В качестве примера выведем текущие дату и время с помощью функции strftime() (лис- тинг 10.2). Листинг 10.2. Форматирование даты и времени # -*- coding: utf-8 -*- import time import locale locale.setlocale(locale.LC_ALL, "Russian_Russia.1251") s = "Сегодня:\n%A %d %b %Y %H:%M:%S\n%d.%m.%Y" print(time.strftime(s)) input() Примерный результат выполнения: Сегодня: вторник 21 ноя 2017 17:38:31 21.11.2017 10.3. «Засыпание» скрипта Функция sleep(<Время в секундах>) из модуля time прерывает выполнение скрипта на ука- занное время, по истечении которого скрипт продолжит работу. В качестве параметра мож- но указать целое или вещественное число: >>> import time # Подключаем модуль time >>> time.sleep(5) # "Засыпаем" на 5 секунд 10.4. Модуль datetime: манипуляции датой и временем Модуль datetime позволяет манипулировать датой и временем: выполнять арифметические операции, сравнивать даты, выводить дату и время в различных форматах и др. Прежде чем использовать классы из этого модуля, необходимо подключить модуль с помощью инст- рукции: import datetime Глава 10. Работа с датой и временем 189 Модуль содержит пять классов: timedelta — дата в виде количества дней, секунд и микросекунд. Экземпляр этого клас- са можно складывать с экземплярами классов date и datetime . Кроме того, результат вычитания двух дат будет экземпляром класса timedelta ; date — представление даты в виде объекта; time — представление времени в виде объекта; datetime — представление комбинации даты и времени в виде объекта; tzinfo — абстрактный класс, отвечающий за зону времени. За подробной информацией по этому классу обращайтесь к документации по модулю datetime 10.4.1. Класс timedelta Класс timedelta из модуля datetime позволяет выполнять операции над датами: склады- вать, вычитать, сравнивать и др. Конструктор класса имеет следующий формат: timedelta([days][, seconds][, microseconds][, milliseconds][, minutes] [, hours][, weeks]) Все параметры не являются обязательными и по умолчанию имеют значение 0 . Первые три параметра считаются основными: days — дни (диапазон -999999999 <= days <= 999999999 ); seconds — секунды (диапазон 0 <= seconds < 3600*24 ); microseconds — микросекунды (диапазон 0 <= microseconds < 1000000 ). Все остальные параметры автоматически преобразуются в следующие значения: milliseconds — миллисекунды (одна миллисекунда преобразуется в 1000 микросекунд): >>> import datetime >>> datetime.timedelta(milliseconds=1) datetime.timedelta(0, 0, 1000) minutes — минуты (одна минута преобразуется в 60 секунд): >>> datetime.timedelta(minutes=1) datetime.timedelta(0, 60) hours — часы (один час преобразуется в 3600 секунд): >>> datetime.timedelta(hours=1) datetime.timedelta(0, 3600) weeks — недели (одна неделя преобразуется в 7 дней): >>> datetime.timedelta(weeks=1) datetime.timedelta(7) Значения можно указать через запятую в порядке следования параметров или присвоить значение названию параметра. В качестве примера укажем один час: >>> datetime.timedelta(0, 0, 0, 0, 0, 1) datetime.timedelta(0, 3600) >>> datetime.timedelta(hours=1) datetime.timedelta(0, 3600) 190 Часть I. Основы языка Python Получить результат можно с помощью следующих атрибутов: days — дни; seconds — секунды; microseconds — микросекунды. Пример: >>> d = datetime.timedelta(hours=1, days=2, milliseconds=1) >>> d datetime.timedelta(2, 3600, 1000) >>> d.days, d.seconds, d.microseconds (2, 3600, 1000) >>> repr(d), str(d) ('datetime.timedelta(2, 3600, 1000)', '2 days, 1:00:00.001000') Получить результат в секундах позволяет метод total_seconds() : >>> d = datetime.timedelta(minutes=1) >>> d.total_seconds() 60.0 Над экземплярами класса timedelta можно производить арифметические операции + , - , / , // , % и * , использовать унарные операторы + и - , а также получать абсолютное значение с помощью функции abs() : >>> d1 = datetime.timedelta(days=2) >>> d2 = datetime.timedelta(days=7) >>> d1 + d2, d2 — d1 # Сложение и вычитание (datetime.timedelta(9), datetime.timedelta(5)) >>> d2 / d1 # Деление 3.5 >>> d1 / 2, d2 / 2.5 # Деление (datetime.timedelta(1), datetime.timedelta(2, 69120)) >>> d2 // d1 # Деление 3 >>> d1 // 2, d2 // 2 # Деление (datetime.timedelta(1), datetime.timedelta(3, 43200)) >>> d2 % d1 # Остаток datetime.timedelta(1) >>> d1 * 2, d2 * 2 # Умножение (datetime.timedelta(4), datetime.timedelta(14)) >>> 2 * d1, 2 * d2 # Умножение (datetime.timedelta(4), datetime.timedelta(14)) >>> d3 = -d1 >>> d3, abs(d3) (datetime.timedelta(-2), datetime.timedelta(2)) Кроме того, можно использовать операторы сравнения == , != , < , <= , > и >= : >>> d1 = datetime.timedelta(days=2) >>> d2 = datetime.timedelta(days=7) >>> d3 = datetime.timedelta(weeks=1) >>> d1 == d2, d2 == d3 # Проверка на равенство (False, True) Глава 10. Работа с датой и временем 191 >>> d1 != d2, d2 != d3 # Проверка на неравенство (True, False) >>> d1 < d2, d2 <= d3 # Меньше, меньше или равно (True, True) >>> d1 > d2, d2 >= d3 # Больше, больше или равно (False, True) Также можно получать строковое представление экземпляра класса timedelta с помощью функций str() и repr() : >>> d = datetime.timedelta(hours = 25, minutes = 5, seconds = 27) >>> str(d) '1 day, 1:05:27' >>> repr(d) 'datetime.timedelta(1, 3927)' Еще поддерживаются следующие атрибуты класса: min — минимальное значение, которое может иметь экземпляр класса timedelta ; max — максимальное значение, которое может иметь экземпляр класса timedelta ; resolution — минимальное возможное различие между значениями timedelta Выведем значения этих атрибутов: >>> datetime.timedelta.min datetime.timedelta(-999999999) >>> datetime.timedelta.max datetime.timedelta(999999999, 86399, 999999) >>> datetime.timedelta.resolution datetime.timedelta(0, 0, 1) 10.4.2. Класс date Класс date из модуля datetime позволяет выполнять операции над датами. Конструктор класса имеет следующий формат: date(<Год>, <Месяц>, <День>) Все параметры являются обязательными. В параметрах можно указать следующий диапазон значений: <Год> — в виде числа, расположенного в диапазоне между значениями, хранящимися в константах MINYEAR и MAXYEAR класса datetime (о нем речь пойдет позже). Выведем значения этих констант: >>> import datetime >>> datetime.MINYEAR, datetime.MAXYEAR (1, 9999) <Месяц> — от 1 до 12 включительно; <День> — от 1 до количества дней в месяце. Если значения выходят за диапазон, возбуждается исключение ValueError : >>> datetime.date(2017, 11, 21) datetime.date(2017, 11, 21) 192 Часть I. Основы языка Python >>> datetime.date(2017, 13, 3) # Неправильное значение для месяца ... Фрагмент опущен ... ValueError: month must be in 1..12 >>> d = datetime.date(2017, 11, 21) >>> repr(d), str(d) ('datetime.date(2017, 11, 21)', '2017-11-21') Для создания экземпляра класса date также можно воспользоваться следующими методами этого класса: today() — возвращает текущую дату: >>> datetime.date.today() # Получаем текущую дату datetime.date(2017, 11, 21) fromtimestamp(<Количество секунд>) — возвращает дату, соответствующую количеству секунд, прошедших с начала эпохи: >>> import datetime, time >>> datetime.date.fromtimestamp(time.time()) # Текущая дата datetime.date(2017, 11, 21) >>> datetime.date.fromtimestamp(1321954972.0) # Дата 22-11-2011 datetime.date(2011, 11, 22) fromordinal(<Количество дней с 1-го года>) — возвращает дату, соответствующую количеству дней, прошедших с первого года. В качестве параметра указывается число от 1 до datetime.date.max.toordinal() : >>> datetime.date.max.toordinal() 3652059 >>> datetime.date.fromordinal(3652059) datetime.date(9999, 12, 31) >>> datetime.date.fromordinal(1) datetime.date(1, 1, 1) |