ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 871
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
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
Получить результат можно с помощью следующих атрибутов:
year
— год (число в диапазоне от
MINYEAR
до
MAXYEAR
);
month
— месяц (число от
1
до
12
);
day
— день (число от
1
до количества дней в месяце).
Пример:
>>> d = datetime.date.today() # Текущая дата (21-11-2017)
>>> d.year, d.month, d.day
(2017, 11, 21)
Над экземплярами класса date можно производить следующие операции:
date2 = date1 + timedelta
— прибавляет к дате указанный период в днях. Значения атрибутов timedelta.seconds и timedelta.microseconds игнорируются;
date2 = date1 — timedelta
— вычитает из даты указанный период в днях. Значения атрибутов timedelta.seconds и timedelta.microseconds игнорируются;
timedelta = date1 — date2
— возвращает разницу между датами (период в днях). Атри- буты timedelta.seconds и timedelta.microseconds будут иметь значение
0
Глава 10. Работа с датой и временем
193
Можно также сравнивать две даты с помощью операторов сравнения:
>>> d1 = datetime.date(2017, 11, 21)
>>> d2 = datetime.date(2017, 1, 1)
>>> t = datetime.timedelta(days=10)
>>> d1 + t, d1 - t # Прибавляем и вычитаем 10 дней
(datetime.date(2017, 12, 1), datetime.date(2017, 11, 11))
>>> d1 - d2 # Разница между датами datetime.timedelta(324)
>>> d1 < d2, d1 > d2, d1 <= d2, d1 >= d2
(False, True, False, True)
>>> d1 == d2, d1 != d2
(False, True)
Класс date поддерживает следующие методы:
replace([year][, month][, day])
— возвращает дату с обновленными значениями. Зна- чения можно указывать через запятую в порядке следования параметров или присвоить значение названию параметра:
>>> d = datetime.date(2017, 11, 21)
>>> d.replace(2016, 12) # Заменяем год и месяц datetime.date(2016, 12, 21)
>>> d.replace(year=2017, month=1, day=31) datetime.date(2017, 1, 31)
>>> d.replace(day=30) # Заменяем только день datetime.date(2017, 1, 30)
strftime(<Строка формата>)
— возвращает отформатированную строку. В строке фор- мата можно задавать комбинации специальных символов, которые используются в функции strftime()
из модуля time
:
>>> d = datetime.date(2017, 11, 21)
>>> d.strftime("%d.%m.%Y")
'21.11.2017'
isoformat()
— возвращает дату в формате
ГГГГ-ММ-ДД
:
>>> d = datetime.date(2017, 11, 21)
>>> d.isoformat()
'2017-11-21'
ctime()
— возвращает строку формата "%a %b %d %H:%M:%S %Y"
:
>>> d = datetime.date(2017, 11, 21)
>>> d.ctime()
'Tue Nov 21 00:00:00 2017'
timetuple()
— возвращает объект struct_time с датой и временем:
>>> d = datetime.date(2017, 11, 21)
>>> d.timetuple() 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)
toordinal()
— возвращает количество дней, прошедших с 1-го года:
>>> d = datetime.date(2017, 11, 21)
>>> d.toordinal()
736654
194
Часть I. Основы языка Python
>>> datetime.date.fromordinal(736654) datetime.date(2017, 11, 21)
weekday()
— возвращает порядковый номер дня в неделе (
0
— для понедельника,
6
— для воскресенья):
>>> d = datetime.date(2017, 11, 21)
>>> d.weekday() # 1 — это вторник
1
isoweekday()
— возвращает порядковый номер дня в неделе (
1
— для понедельника,
7
— для воскресенья):
>>> d = datetime.date(2017, 11, 21)
>>> d.isoweekday() # 2 — это вторник
2
isocalendar()
— возвращает кортеж из трех элементов (год, номер недели в году и по- рядковый номер дня в неделе):
>>> d = datetime.date(2017, 11, 21)
>>> d.isocalendar()
(2017, 47, 2)
Наконец, имеется поддержка следующих атрибутов класса:
min
— минимально возможное значение даты;
max
— максимально возможное значение даты;
resolution
— минимальное возможное различие между значениями даты.
Выведем значения этих атрибутов:
>>> datetime.date.min datetime.date(1, 1, 1)
>>> datetime.date.max datetime.date(9999, 12, 31)
>>> datetime.date.resolution datetime.timedelta(1)
10.4.3. Класс time
Класс time из модуля datetime позволяет выполнять операции над значениями времени.
Конструктор класса имеет следующий формат: time([hour][, minute][, second][, microsecond][, tzinfo], [fold])
Все параметры не являются обязательными. Значения можно указывать через запятую в порядке следования параметров или присвоить значение названию параметра. В парамет- рах можно указать следующий диапазон значений:
hour
— часы (число от
0
до
23
);
minute
— минуты (число от
0
до
59
);
second
— секунды (число от
0
до
59
);
microsecond
— микросекунды (число от
0
до
999999
);
tzinfo
— зона (экземпляр класса tzinfo или значение
None
);