ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 869
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Глава 10. Работа с датой и временем
195
fold
— порядковый номер отметки времени. Значение
0
(используется по умолчанию) обозначает первую отметку, значение
1
— вторую. Введено в Python 3.6 для тех случаев, когда в данной временной зоне практикуется перевод часов с зимнего на летнее время и обратно, в результате чего часы могут дважды в сутки показывать одинаковое время.
Если значения выходят за диапазон, возбуждается исключение
ValueError
:
>>> import datetime
>>> datetime.time(23, 12, 38, 375000) datetime.time(23, 12, 38, 375000)
>>> t = datetime.time(hour=23, second=38, minute=12)
>>> repr(t), str(t)
('datetime.time(23, 12, 38)', '23:12:38')
>>> datetime.time(25, 12, 38, 375000)
... Фрагмент опущен ...
ValueError: hour must be in 0..23
Получить результат можно с помощью следующих атрибутов:
hour
— часы (число от
0
до
23
);
minute
— минуты (число от
0
до
59
);
second
— секунды (число от
0
до
59
);
microsecond
— микросекунды (число от
0
до
999999
);
tzinfo
— зона (экземпляр класса tzinfo или значение
None
);
fold
— порядковый номер отметки времени (число
0
или
1
). Поддержка этого атрибута появилась в Python 3.6.
Пример:
>>> t = datetime.time(23, 12, 38, 375000)
>>> t.hour, t.minute, t.second, t.microsecond
(23, 12, 38, 375000)
Над экземплярами класса time нельзя выполнять арифметические операции. Можно только производить сравнения:
>>> t1 = datetime.time(23, 12, 38, 375000)
>>> t2 = datetime.time(12, 28, 17)
>>> t1 < t2, t1 > t2, t1 <= t2, t1 >= t2
(False, True, False, True)
>>> t1 == t2, t1 != t2
(False, True)
Класс time поддерживает следующие методы:
replace([hour][, minute][, second][, microsecond][, tzinfo])
— возвращает время с обновленными значениями. Значения можно указывать через запятую в порядке сле- дования параметров или присвоить значение названию параметра:
>>> t = datetime.time(23, 12, 38, 375000)
>>> t.replace(10, 52) # Заменяем часы и минуты datetime.time(10, 52, 38, 375000)
>>> t.replace(second=21) # Заменяем только секунды datetime.time(23, 12, 21, 375000)
196
Часть I. Основы языка Python
isoformat()
— возвращает время в формате ISO 8601:
>>> t = datetime.time(23, 12, 38, 375000)
>>> t.isoformat()
'23:12:38.375000'
strftime(<Строка формата>)
— возвращает отформатированную строку. В строке фор- мата можно указывать комбинации специальных символов, которые используются в функции strftime()
из модуля time
:
>>> t = datetime.time(23, 12, 38, 375000)
>>> t.strftime("%H:%M:%S")
'23:12:38'
Дополнительно класс time поддерживает такие атрибуты:
min
— минимально возможное значение времени;
max
— максимально возможное значение времени;
resolution
— минимальное возможное различие между значениями времени.
Вот значения этих атрибутов:
>>> datetime.time.min datetime.time(0, 0)
>>> datetime.time.max datetime.time(23, 59, 59, 999999)
>>> datetime.time.resolution datetime.timedelta(0, 0, 1)
П
РИМЕЧАНИЕ
Класс time поддерживает также методы dst(), utcoffset() и tzname(). За подробной информацией по этим методам, а также по абстрактному классу tzinfo обращайтесь к до- кументации по модулю datetime.
10.4.4. Класс datetime
Класс datetime из модуля datetime позволяет выполнять операции над комбинацией даты и времени. Конструктор класса имеет следующий формат: datetime(<Год>, <Месяц>, <День>[, hour][, minute][, second]
[, microsecond][, tzinfo][, fold])
Первые три параметра являются обязательными. Остальные значения можно указывать через запятую в порядке следования параметров или присвоить значение названию пара- метра. В параметрах можно указать следующий диапазон значений:
<Год>
— в виде числа, расположенного в диапазоне между значениями, хранящимися в константах
MINYEAR
(
1
) и
MAXYEAR
(
9999
);
<Месяц>
— число от
1
до
12
включительно;
<День>
— число от
1
до количества дней в месяце;
hour
— часы (число от
0
до
23
);
minute
— минуты (число от
0
до
59
);
second
— секунды (число от
0
до
59
);
Глава 10. Работа с датой и временем
197
microsecond
— микросекунды (число от
0
до
999999
);
tzinfo
— зона (экземпляр класса tzinfo или значение
None
);
fold
— порядковый номер отметки времени. Значение
0
(используется по умолчанию) обозначает первую отметку, значение
1
— вторую. Введено в Python 3.6 для тех случаев, когда в данной временной зоне практикуется перевод часов с зимнего на летнее время и обратно, в результате чего часы могут дважды в сутки показывать одинаковое время.
Если значения выходят за диапазон, возбуждается исключение
ValueError
:
>>> import datetime
>>> datetime.datetime(2017, 11, 21) datetime.datetime(2017, 11, 21, 0, 0)
>>> datetime.datetime(2017, 11, 21, hour=17, minute=47) datetime.datetime(2017, 11, 21, 17, 47)
>>> datetime.datetime(2017, 32, 20)
... Фрагмент опущен ...
ValueError: month must be in 1..12
>>> d = datetime.datetime(2017, 11, 21, 17, 47, 43)
>>> repr(d), str(d)
('datetime.datetime(2017, 11, 21, 17, 47, 43)', '2017-11-21 17:47:43')
Для создания экземпляра класса datetime также можно воспользоваться следующими мето- дами:
today()
— возвращает текущие дату и время:
>>> datetime.datetime.today() datetime.datetime(2017, 11, 21, 17, 48, 27, 932332)
now([<Зона>])
— возвращает текущие дату и время. Если параметр не задан, то метод аналогичен методу today()
:
>>> datetime.datetime.now() datetime.datetime(2017, 11, 21, 17, 48, 51, 703618)
utcnow()
— возвращает текущее универсальное время (UTC):
>>> datetime.datetime.utcnow() datetime.datetime(2017, 11, 21, 14, 49, 4, 497928)
fromtimestamp(<Количество секунд>[, <Зона>])
— возвращает дату, соответствующую количеству секунд, прошедших с начала эпохи:
>>> import datetime, time
>>> datetime.datetime.fromtimestamp(time.time()) datetime.datetime(2017, 11, 21, 17, 49, 27, 394796)
>>> datetime.datetime.fromtimestamp(1511273856.0) datetime.datetime(2017, 11, 21, 17, 17, 36)
utcfromtimestamp(<Количество секунд>)
— возвращает дату, соответствующую количе- ству секунд, прошедших с начала эпохи, в универсальном времени (UTC):
>>> datetime.datetime.utcfromtimestamp(time.time()) datetime.datetime(2017, 11, 21, 14, 50, 10, 596706)
>>> datetime.datetime.utcfromtimestamp(1511273856.0) datetime.datetime(2017, 11, 21, 14, 17, 36)
198
Часть I. Основы языка Python
fromordinal(<Количество дней с 1-го года>)
— возвращает дату, соответствующую количеству дней, прошедших с 1-го года. В качестве параметра указывается число от
1
до datetime.datetime.max.toordinal()
:
>>> datetime.datetime.max.toordinal()
3652059
>>> datetime.datetime.fromordinal(3652059) datetime.datetime(9999, 12, 31, 0, 0)
>>> datetime.datetime.fromordinal(1) datetime.datetime(1, 1, 1, 0, 0)
combine(<Экземпляр класса date>, <Экземпляр класса time>)
— возвращает экземпляр класса datetime
, созданный на основе переданных ему экземпляров классов date и time
:
>>> d = datetime.date(2017, 11, 21) # Экземпляр класса date
>>> t = datetime.time(17, 51, 22) # Экземпляр класса time
>>> datetime.datetime.combine(d, t) datetime.datetime(2017, 11, 21, 17, 51, 22)
strptime(<Строка с датой>, <Строка формата>)
— разбирает строку, указанную в пер- вом параметре, в соответствии со строкой формата, создает на основе полученных из разобранной строки данных экземпляр класса datetime и возвращает его. Если строка не соответствует формату, возбуждается исключение
ValueError
. Метод учитывает теку- щую локаль:
>>> datetime.datetime.strptime("21.11.2017", "%d.%m.%Y") datetime.datetime(2017, 11, 21, 0, 0)
>>> datetime.datetime.strptime("21.11.2017", "%d-%m-%Y")
... Фрагмент опущен ...
ValueError: time data '21.11.2017' does not match format '%d-%m-%Y'
Получить результат можно с помощью следующих атрибутов:
year
— год (число в диапазоне от
MINYEAR
до
MAXYEAR
);
month
— месяц (число от
1
до
12
);
day
— день (число от
1
до количества дней в месяце);
hour
— часы (число от
0
до
23
);
minute
— минуты (число от
0
до
59
);
second
— секунды (число от
0
до
59
);
microsecond
— микросекунды (число от
0
до
999999
);
tzinfo
— зона (экземпляр класса tzinfo или значение
None
).
fold
— порядковый номер отметки времени (число
0
или
1
). Поддержка этого атрибута появилась в Python 3.6.
Примеры:
>>> d = datetime.datetime(2017, 11, 21, 17, 53, 58)
>>> d.year, d.month, d.day
(2017, 11, 21)
>>> d.hour, d.minute, d.second, d.microsecond
(17, 53, 58, 0)
Глава 10. Работа с датой и временем
199
Над экземплярами класса datetime можно производить следующие операции:
datetime2 = datetime1 + timedelta
— прибавляет к дате указанный период;
datetime2 = datetime1 — timedelta
— вычитает из даты указанный период;
timedelta = datetime1 — datetime2
— возвращает разницу между датами.
Можно также сравнивать две даты с помощью операторов сравнения.
Примеры:
>>> d1 = datetime.datetime(2017, 11, 21, 17, 54, 8)
>>> d2 = datetime.datetime(2017, 11, 1, 12, 31, 4)
>>> t = datetime.timedelta(days=10, minutes=10)
>>> d1 + t # Прибавляем 10 дней и 10 минут datetime.datetime(2017, 12, 1, 18, 4, 8)
>>> d1 - t # Вычитаем 10 дней и 10 минут datetime.datetime(2017, 11, 11, 17, 44, 8)
>>> d1 - d2 # Разница между датами datetime.timedelta(20, 19384)
>>> d1 < d2, d1 > d2, d1 <= d2, d1 >= d2
(False, True, False, True)
>>> d1 == d2, d1 != d2
(False, True)
Класс datetime поддерживает следующие методы:
date()
— возвращает экземпляр класса date
, хранящий дату:
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.date() datetime.date(2017, 11, 21)
time()
— возвращает экземпляр класса time
, хранящий время:
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.time() datetime.time(17, 56, 41)
timetz()
— возвращает экземпляр класса time
, хранящий время. Метод учитывает пара- метр tzinfo
;
timestamp()
— возвращает вещественное число, представляющее количество секунд, прошедшее с начала эпохи (обычно с 1 января 1970 г.):
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.timestamp()
1511276201.0
replace([year][, month][, day][, hour][, minute][, second][, microsecond][, tzinfo])
— возвращает дату с обновленными значениями. Значения можно указывать через запятую в порядке следования параметров или присвоить значение названию па- раметра:
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.replace(2016, 12) datetime.datetime(2016, 12, 21, 17, 56, 41)
>>> d.replace(hour=12, month=10) datetime.datetime(2016, 10, 21, 12, 56, 41)
200
Часть I. Основы языка Python
timetuple()
— возвращает объект struct_time с датой и временем:
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.timetuple() time.struct_time(tm_year=2017, tm_mon=11, tm_mday=21, tm_hour=17, tm_min=56, tm_sec=41, tm_wday=1, tm_yday=325, tm_isdst=-1)
utctimetuple()
— возвращает объект struct_time с датой в универсальном времени
(UTC):
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.utctimetuple() time.struct_time(tm_year=2017, tm_mon=11, tm_mday=21, tm_hour=17, tm_min=56, tm_sec=41, tm_wday=1, tm_yday=325, tm_isdst=0)
toordinal()
— возвращает количество дней, прошедшее с 1-го года:
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.toordinal()
736654
weekday()
— возвращает порядковый номер дня в неделе (
0
— для понедельника,
6
— для воскресенья):
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.weekday() # 1 — это вторник
1
isoweekday()
— возвращает порядковый номер дня в неделе (
1
— для понедельника,
7
— для воскресенья):
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.isoweekday() # 2 — это вторник
2
isocalendar()
— возвращает кортеж из трех элементов (год, номер недели в году и по- рядковый номер дня в неделе):
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.isocalendar()
(2017, 47, 2)
isoformat([<Разделитель даты и времени>])
— возвращает дату в формате ISO 8601.
Если разделитель не указан, используется буква
T
:
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.isoformat() # Разделитель не указан '2017-11-21T17:56:41'
1 ... 14 15 16 17 18 19 20 21 ... 83
>>> d.isoformat(" ") # Пробел в качестве разделителя '2017-11-21 17:56:41'
ctime()
— возвращает строку формата "%a %b %d %H:%M:%S %Y"
:
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.ctime()
'Tue Nov 21 17:56:41 2017'
strftime(<Строка формата>)
— возвращает отформатированную строку. В строке фор- мата можно указывать комбинации специальных символов, которые используются в функции strftime()
из модуля time
:
Глава 10. Работа с датой и временем
201
>>> d = datetime.datetime(2017, 11, 21, 17, 56, 41)
>>> d.strftime("%d.%m.%Y %H:%M:%S")
'21.11.2017 17:56:41'
Поддерживаются также следующие атрибуты класса:
min
— минимально возможные значения даты и времени;
max
— максимально возможные значения даты и времени;
resolution
— минимальное возможное различие между значениями даты и времени.
Значения этих атрибутов:
>>> datetime.datetime.min datetime.datetime(1, 1, 1, 0, 0)
>>> datetime.datetime.max datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
>>> datetime.datetime.resolution datetime.timedelta(0, 0, 1)
П
РИМЕЧАНИЕ
Класс datetime также поддерживает методы astimezone(), dst(), utcoffset() и tzname()
. За подробной информацией по этим методам, а также по абстрактному классу tzinfo
, обращайтесь к документации по модулю datetime.
10.5. Модуль calendar: вывод календаря
Модуль calendar формирует календарь в виде простого текста или HTML-кода. Прежде чем использовать модуль, необходимо подключить его с помощью инструкции: import calendar
Модуль предоставляет следующие классы:
Calendar
— базовый класс, который наследуют все остальные классы. Формат конструк- тора:
Calendar([<Первый день недели>])
В качестве примера получим двумерный список всех дней в ноябре 2017 года, распреде- ленных по дням недели:
>>> import calendar
>>> c = calendar.Calendar(0)
>>> c.monthdayscalendar(2017, 11) # 11 — это ноябрь
[[0, 0, 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, 0, 0, 0]]
TextCalendar
— позволяет вывести календарь в виде простого текста. Формат конструк- тора:
TextCalendar([<Первый день недели>])
Выведем календарь на весь 2017 год:
>>> c = calendar.TextCalendar(0)
>>> print(c.formatyear(2017)) # Текстовый календарь на 2017 год
202
Часть I. Основы языка Python
В качестве результата мы получим большую строку, содержащую календарь в виде от- форматированного текста;
LocaleTextCalendar
— позволяет вывести календарь в виде простого текста. Названия месяцев и дней недели выводятся в соответствии с указанной локалью. Формат конст- руктора:
LocaleTextCalendar([<Первый день недели>[, <Название локали>]])
Выведем календарь на весь 2017 год на русском языке:
>>> c = calendar.LocaleTextCalendar(0, "Russian_Russia.1251")
>>> print(c.formatyear(2017))
HTMLCalendar
— позволяет вывести календарь в формате HTML. Формат конструктора:
HTMLCalendar([<Первый день недели>])
Выведем календарь на весь 2017 год:
>>> c = calendar.HTMLCalendar(0)
>>> print(c.formatyear(2017))
Результатом будет большая строка с HTML-кодом календаря, отформатированного в виде таблицы;
LocaleHTMLCalendar
— позволяет вывести календарь в формате HTML. Названия ме- сяцев и дней недели выводятся в соответствии с указанной локалью. Формат конструк- тора:
LocaleHTMLCalendar([<Первый день недели>[, <Название локали>]])
Выведем календарь на весь 2017 год на русском языке в виде отдельной веб-страницы:
>>> c = calendar.LocaleHTMLCalendar(0, "Russian_Russia.1251")
>>> xhtml = c.formatyearpage(2017, encoding="windows-1251")
>>> print(xhtml.decode("cp1251"))
В первом параметре всех конструкторов указывается число от
0
(для понедельника) до
6
(для воскресенья). Если параметр не указан, его значение принимается равным
0
. Вместо чисел можно использовать встроенные константы:
MONDAY
,
TUESDAY
,
WEDNESDAY
,
THURSDAY
,
FRIDAY
,
SATURDAY
или
SUNDAY
, поддерживаемые классом calendar
. Изменить значение пара- метра позволяет метод setfirstweekday(<Первый день недели>)
В качестве примера выведем текстовый календарь на январь 2017 года, где первым днем недели является воскресенье:
>>> c = calendar.TextCalendar() # Первый день понедельник
>>> c.setfirstweekday(calendar.SUNDAY) # Первый день теперь воскресенье
>>> print(c.formatmonth(2017, 1)) # Текстовый календарь на январь 2017 г.
10.5.1. Методы классов TextCalendar и LocaleTextCalendar
Классы
TextCalendar и
LocaleTextCalendar поддерживают следующие методы:
formatmonth(<Год>, <Месяц>[, <Ширина поля с днем>[, <Количество символов перевода строки>]])
— возвращает текстовый календарь на указанный месяц в году. Третий па- раметр позволяет указать ширину поля с днем, а четвертый параметр — количество символов перевода строки между строками.
Глава 10. Работа с датой и временем
203
Выведем календарь на декабрь 2017 года:
>>> import calendar
>>> c = calendar.LocaleTextCalendar(0, "Russian_Russia.1251")
>>> print(c.formatmonth(2017, 12))
Декабрь 2017
Пн Вт Ср Чт Пт Сб Вс
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
prmonth(<Год>, <Месяц>[, <Ширина поля с днем>[, <Количество символов перевода строки>]])
— аналогичен методу formatmonth()
, но не возвращает календарь в виде строки, а сразу выводит его на экран.
Распечатаем календарь на декабрь 2017 года, указав ширину поля с днем, равной 4 сим- волам:
>>> c = calendar.LocaleTextCalendar(0, "Russian_Russia.1251")
>>> c.prmonth(2017, 12, 4)
Декабрь 2017
Пн Вт Ср Чт Пт Сб Вс
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
formatyear(<Год>[, w=2][, l=1][, c=6][, m=3])
— возвращает текстовый календарь на указанный год. Параметры имеют следующее предназначение:
• w
— ширина поля с днем (по умолчанию
2
);
• l
— количество символов перевода строки между строками (по умолчанию
1
);
• c
— количество пробелов между месяцами (по умолчанию
6
);
• m
— количество месяцев на строке (по умолчанию
3
).
Значения можно записывать через запятую в порядке следования параметров или при- своить значение названию параметра.
В качестве примера сформируем календарь на 2018 год, при этом на одной строке выве- дем сразу четыре месяца и установим количество пробелов между месяцами:
>>> c = calendar.LocaleTextCalendar(0, "Russian_Russia.1251")
>>> print(c.formatyear(2018, m=4, c=2))
pryear(<Год>[, w=2][, l=1][, c=6][, m=3])
— аналогичен методу formatyear()
, но не возвращает календарь в виде строки, а сразу выводит его.
В качестве примера распечатаем календарь на 2018 год по два месяца на строке, рас- стояние между месяцами установим равным 4-м символам, ширину поля с датой — рав- ной 2-м символам, а строки разделим одним символом перевода строки:
>>> c = calendar.LocaleTextCalendar(0, "Russian_Russia.1251")
>>> c.pryear(2018, 2, 1, 4, 2)
204
Часть I. Основы языка Python
10.5.2. Методы классов HTMLCalendar и LocaleHTMLCalendar
Классы
HTMLCalendar и
LocaleHTMLCalendar поддерживают следующие методы:
formatmonth(<Год>, <Месяц>[,
— возвращает календарь на указанный месяц в году в виде HTML-кода. Если в третьем параметре указано значение
True
(зна- чение по умолчанию), то в заголовке таблицы после названия месяца будет указан год.
Календарь будет отформатирован в виде HTML-таблицы. Для каждой ячейки таблицы задается стилевой класс, с помощью которого можно управлять внешним видом кален- даря. Названия стилевых классов доступны через атрибут cssclasses
, который содержит список названий для каждого дня недели:
>>> import calendar
>>> c = calendar.HTMLCalendar(0)
>>> print(c.cssclasses)
['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
Выведем календарь на ноябрь 2017 года, для будних дней укажем класс "workday"
, а для выходных дней — класс "week-end"
:
>>> c = calendar.LocaleHTMLCalendar(0, "Russian_Russia.1251")
>>> c.cssclasses = ["workday", "workday", "workday", "workday",
"workday", "week-end", "week-end"]
>>> print(c.formatmonth(2017, 11, False))
formatyear(<Год>[, <Количество месяцев на строке>])
— возвращает календарь на ука- занный год в виде HTML-кода. Календарь будет отформатирован с помощью несколь- ких HTML-таблиц.
Для примера выведем календарь на 2017 год так, чтобы на одной строке выводились сразу четыре месяца:
>>> c = calendar.LocaleHTMLCalendar(0, "Russian_Russia.1251")
>>> print(c.formatyear(2017, 4))
formatyearpage(<Год>[, width][, css][, encoding])
— возвращает календарь на ука- занный год в виде отдельной веб-страницы. Параметры имеют следующее предназначе- ние:
• width
— количество месяцев на строке (по умолчанию
3
);
• css
— название файла с таблицей стилей (по умолчанию "calendar.css"
);
• encoding
— кодировка файла. Название кодировки будет указано в параметре encoding
XML-пролога, а также в теге
Значения можно указать через запятую в порядке следования параметров или присвоить значение названию параметра.
Для примера выведем календарь на 2017 год так, чтобы на одной строке выводилось четыре месяца, дополнительно указав кодировку:
>>> c = calendar.LocaleHTMLCalendar(0, "Russian_Russia.1251")
>>> xhtml = c.formatyearpage(2017, 4, encoding="windows-1251")
>>> type(xhtml) # Возвращаемая строка имеет тип данных bytes
>>> print(xhtml.decode("cp1251"))