Главная страница

ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов


Скачать 7.92 Mb.
НазваниеНиколай Прохоренок Владимир Дронов
Дата05.05.2023
Размер7.92 Mb.
Формат файлаpdf
Имя файлаПрохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен.pdf
ТипДокументы
#1111379
страница17 из 83
1   ...   13   14   15   16   17   18   19   20   ...   83
 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)
1   ...   13   14   15   16   17   18   19   20   ...   83


написать администратору сайта