I'm main, in process 97080
I'm loopy, in process 97081
Number 1 of 1000000. Honk!
Number 2 of 1000000. Honk!
Number 3 of 1000000. Honk!
Number 4 of 1000000. Honk!
Number 5 of 1000000. Honk!
Календари и часы
Программисты прилагают удивительное количество усилий в процессе работы
с датами и временем. Поговорим о некоторых проблемах, с которыми они сталки-
ваются, а затем рассмотрим лучшие способы и приемы, позволяющие проще с ними
справиться.
Даты могут быть представлены множеством способов — их даже слишком мно-
го. Даже англоговорящие люди, использующие римский календарь, применяют
множество вариантов представления простой даты:
July 29 1984;
29 Jul 1984;
29/7/1984;
7/29/1984.
292
Глава 10. Системы
Помимо других проблем, представление даты может быть двусмысленным.
В предыдущих примерах довольно легко определить, что 7 означает месяц, а 29 —
день месяца, в основном потому что у месяца не может быть номера 29. Но как
насчет даты 1/6/2012? Мы говорим о 6 января или 1 июня?
Название месяца в римском календаре изменяется в зависимости от языка. Даже
год и месяц могут иметь разные определения в разных культурах.
Високосные годы — это еще одна проблема. Вы, возможно, знаете, что каждый
четвертый год является високосным (в этом году проходят летняя олимпиада и вы-
боры президента в Америке). Знаете ли вы, что каждый сотый год не является
високосным, а каждый 400-й — является? Рассмотрим пример кода, в котором
проверяется, является ли год високосным:
>>> import calendar
>>> calendar.isleap(1900)
False
>>> calendar.isleap(1996)
True
>>> calendar.isleap(1999)
False
>>> calendar.isleap(2000)
True
>>> calendar.isleap(2002)
False
>>> calendar.isleap(2004)
True
Работа с временем также может доставить неприятности, особенно из-за часовых
поясов и перехода на летнее время. Если вы взглянете на карту часовых поясов, то
окажется, что эти пояса больше соответствуют политическим и историческим
границам, вместо того чтобы сменяться каждые 15° (360°/24) долготы. Кроме того,