Главная » Free Pascal » Календари, даты, время Free Pascal

0
Немного истории

Термин "календарь" обязан своим происхождением латинским словам calendae (первый день месяца) и calendarium (долговая книга). В Древнем Риме на первое число каждого месяца приходилось время уплаты процентов по долгам.

Наиболее стабильным длительным промежутком времени с точки зрения уче- ных, ведущих астрономические наблюдения, является тропический год — интервал между моментами прохождения центра Солнца через так называемую точку весен- него или осеннего равноденствия. Наблюдается это явление 21 марта и 23 сентября в обычный год и со смещением на один день — в високосный год. В этот момент лучи Солнца падают на экватор отвесно и продолжительности ночи и дня совпада- ют. Длительность тропического года составляет 365 суток 5 час 48 мин и примерно 46 секунд (365.2422 солнечных суток, длительность последних — 24 часа).

Древние календари, в большинстве своем, базировались на фазах Луны. Так, например, в Вавилоне год состоял из 12 лунных месяцев с чередующейся длитель- ностью месяцев 29   30   29   30   … Однако суммарная длительность такого года

составляла 354 дня.

Один из первых солнечных календарей был принят в Египте примерно в чет- вертом тысячелетии до новой эры. По египетскому календарю год состоял из 365 дней и включал 12 месяцев по 30 дней. В конце года 5 дней объявлялись праздничными и не входили ни в один из месяцев.

Наиболее близким к тропическому году стал римский календарь, принятый по указу императора Юлия Цезаря в 47 г. до н. э. Для ликвидации разницы с астроно- мическим годом длительность 46 года была установлена в 432 дня. После этого вводились три года по 365 дней, за которыми следовал 1 високосный год. Таким образом, средняя продолжительность римского года достигла 365.25 суток, что не- много превышало длительность тропического года. Тем не менее за 1500 лет набе- жало порядка 10 лишних суток.

За очередное улучшение календаря принялся ватиканский ученый Луиджи Ли- лио. В 1582 г. по указу (булле) папы Григория XIII был принят новый календарь, переход на который в разных странах затянулся на 200—300 лет. В России, напри- мер, новый календарь был введен декретом СНК РСФСР в январе 1918 г. (после

31 января наступило 14 февраля, день недели при этом сохранялся автоматически). Даты Римского календаря стали называть "старым стилем", а даты григорианского календаря — "новым стилем". Суть Ватиканской реформы заключалась в следую- щем. После четверга 4 октября 1582 г. следующим днем объявлялась пятница 15 ок- тября. Так устранялись набежавшие излишки. Второе новшество заключалось в том, что из круглых дат столетий исключались високосные годы, которые не дели- лись нацело на 400. При этом средняя длительность года по григорианскому ка- лендарю оказалась длиннее тропического года всего на 26 секунд. Так что разница в 1 сутки сможет набежать примерно к 4860 году.

Обратите внимание на специфику перехода от летоисчисления до новой эры. Первый год новой эры (эры Дионисия), последовавший после первого года до но- вой эры, отсчитывается от даты рождества Христова. С точки зрения математики, ему должен предшествовать 0-й год, которого не было. Поэтому в алгоритмах ис- числения непрерывных календарных дат номера лет до новой эры следует считать отрицательными и увеличивать их на 1.

В конце того же XVI века астроном Джозеф Скалигер предложил новый способ отсчета времени. Начинался он от некоторого условного нуля (12 часов дня все- мирного времени в понедельник 1 января 4713 г. до н. э., а с учетом приведенного выше замечания начальный год равен –4712) и представлялся в виде постоянно

работающего таймера, отсчитывающего сутки и текущее время с шагом 10–5. Целая

часть юлианской даты JD (она была так названа в честь отца Скалигера) определя- ла количество суток, прошедших от начала отсчета, а дробная часть от 0.0 до 0.99999 соответствовала показанию суточных часов. Переход к следующей едини- це отсчета происходил в 12 часов очередного дня.

Пример приведен в табл. 14.1.

Таблица 14.1

Григорианская дата

Юлианская дата

1 января 4712 г. до н. э. в 12 часов дня

JD = 0.00000

2 января 4712 г. до н. э. в 12 часов дня

JD = 1.00000

3 января 4712 г. до н. э. в 18 часов вечера

JD = 2.25000

1 января 1900 г. в 12 часов дня

JD = 2415021.0

22 июня 1941 г. в 4 часа в утра

JD = 2430167.66667

9 мая 1945 г. в 12 часов дня

JD = 2431585.0

1 января 1999 г. в 12 часов дня

JD = 2451180.0

1 января 2000 г. в 12 часов дня

JD = 2451545.0

Следует заметить, что предложенная идея отсчета времени используется не только астрономами. В системах визуального программирования Borland C++Builder

и Delphi появился класс TDateTime, в объектах которого хранится обобщенное зна- чение даты и времени в формате вещественного числа с двойной точностью (double). Его целая часть равна количеству дней, прошедших с полуночи 30 декаб- ря 1899 г., а дробная часть соответствует времени дня. По сравнению с юлианской датой изменилась только точка начала отсчета.

Хранение даты и времени в формате юлианского дня представляется достаточ- но экономичным. Потребуется всего 8 байт для величины типа double, тогда как для запоминания символьной строки вида "YYYY/MM/DD HH:MM:SS" необходи- мо не менее 20 байт. Непрерывный таймер Дж. Скалигера удобен еще и тем, что позволяет очень просто вычислять различные временные интервалы как с точно- стью до суток, прошедших между двумя календарными датами, так и с точностью до секунд и даже долей секунды.

Итак, цивилизованный мир сегодня живет по григорианскому календарю, для которого типичны следующие количественные характеристики:

± обычный год насчитывает 365 суток (дней) и содержит 12 месяцев, каждому из которых присваивается индивидуальное имя и уникальный порядковый номер от 1 до 12;

± длительность месяцев обычного года (в сутках) описывается последовательно- стью 31     28     31     30     31     30     31     31    30     31     30     31;

± сутки измеряются часами, минутами и секундами от 00:00:00 до 23:59:59;

± каждые 7 суток, прошедшие от начала года, составляют неделю, имеют инди- видуальные имена и уникальные порядковые номера от 1 до 7 (стандарт ISO);

± високосным считается год, номер которого без остатка делится на 4 или делит- ся на 100, но не делится без остатка на 400. В этом году на один день больше, и этот дополнительный день увеличивает длительность второго месяца года.

В быстротечных компьютерных событиях приходится прибегать и к более ко- ротким единицам измерения времени — тысячным и миллионным долям секун- ды — миллисекундам и микросекундам.

Модуль DateUtils

В модуле DateUtils представлена очень внушительная коллекция, насчиты- вающая более 150 процедур и функций, обеспечивающих обработку календарных дат и интервалов времени. Порядка 25 подпрограмм из числа наиболее используе- мых включены и в состав модуля SysUtils. Несколько устаревших функций сохра- нены в модуле Dos.

Мы уже упоминали, что большинство процедур обработки интервалов времени

связано с представлением текущего момента времени в формате TDateTime. По су- ществу такое значение совпадает с модифицированной величиной юлианской даты. При этом целая часть вещественного значения типа TDateTime равна количеству дней, прошедших с полуночи 30 декабря 1899 г., а дробная часть соответствует времени дня. Так как количество дней за две-три сотни лет, отсчитанных после

1899 г., не превышает миллиона, то в целой части может быть задействовано не более шести цифр. Оставшиеся 10 значащих цифр значения типа double могут быть использованы для дробной части. Поэтому ошибка в представлении времени суток в формате TDateTime не превышает 10–5 секунд, т. е. 10 микросекунд. Именно этим объясняется наличие трех дробных цифр в значении секунд при выводе наи- более полного значения времени:

21.11.2009 21:42:20.796

Количество процедур и функций в модуле DateUtils довольно велико. В зна- чительной мере на это обстоятельство повлияли два следующих фактора. Во- первых, сказался выбор формата упакованных данных. Довольно много процедур обеспечивают формирование, модификацию и извлечение соответствующих ком- понентов даты и времени. Во-вторых, на количестве процедур сказалось и разнооб- разие единиц измерения интервалов времени — годы, месяцы, недели, дни, часы, минуты, секунды и миллисекунды.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии