Найти в Дзене

Дата и время в Lazarus

Программисту очень часто приходится работать с датой и временем, поэтому в любых языках программирования имеются возможности для обработки этого вида данных. В Delphi/Lazarus для этого имеется тип данных TDateTime, который хранит сведения о дате и времени. По сути он представляет собой вещественной число, где в целой части хранится дата, а в дробной - время. Этот тип объявлен в файле systemh.inc так:

TDateTime = type Double;

Для использования этого типа к программе надо подключить модуль SysUtils.

Отсчёт даты начинается с 30.12.1899 года. То есть если мы присвоим переменной типа TDateTime число 0, то это будет соответствовать 30.12.1899 12:00.

Если мы продолжим экспериментировать. и присвоим переменной типа TDateTime число 1, то это будет 31.12.1899 12:00. То есть каждые сутки - это единица в целой части числа. Таким образом, 04.11.2024 будет соответствовать значению 45600 в целой части числа - столько дней прошло с 30.12.1899.

А можно ли как-то работать с датой, которая раньше 30.12.1899 года? Да, можно. Для этого число должно быть отрицательным. Например, значению -1 соответствует дата 29.12.1899. С отрицательными значениями TDateTime следует обращаться осторожно. Неправильное использование отрицательных значений может привести к различным неприятностям.

Максимальная правильная дата ограничена значением 31.12.9999 23:59:59:999. Все значения, выходящие за пределы этой даты, вызывают ошибки и исключения в большинстве процедур, работающих со значениями даты и времени.

С дробной частью (со временем) разобраться посложнее. Здесь можно ориентироваться на то, что одни сутки - это единица. Соответственно, половина единицы (0,5) - это половина суток (12 часов), четверть суток - это 6 часов и т.п.

Например, если мы присвоим переменной типа TDateTime число 1.25, то это будет 31.12.1899 6:00. Соответственно, один час - это 1/24 суток, то есть 0,04167 примерно (увы, абсолютной точности здесь сложно добиться, но она в случае со временем и не нужна).

Далее: минута - это 1/60 часа, или 1/1440 суток. Следовательно, это от суток будет примерно 0,000695. То есть если мы присвоим переменной типа TDateTime число 1.000695, то это будет 31.12.1899 0:01:00. Ну и так далее…

А теперь небольшой примерчик:

Как вы уже поняли, в одной переменной типа TDateTime хранятся данные как о дате, так и о времени. А что именно - дату или время вы будете использовать, зависит о того, какую часть переменной вы обрабатываете - целую или дробную.

В комментариях всё описано. Так что дополнительных пояснений не будет. Разве что скажу о том, что как в Delphi, так и в Lazarus имеется множество подпрограмм для работы с датой и временем. Основные из них собраны в модулях SysUtils и DateUtils. Ну а если кому лень ручками переписывать пример, но хочется узнать, что он выведет, то на экране это будет вот так:

-2

Ах да, ещё скажу, что вы можете увеличить дату, например, на 1, вот так:

CurrDate := CurrDate + 1;

Но не можете вот так:

Inc(CurrDate);

поскольку тип TDateTime не является порядковым.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.