Модуль SysUtils
Рассмотрим некоторые процедуры и функции по работе с датой и временем из модуля
SysUtils .
1. Форматирование даты и времени путем преобразования в строку
Для преобразования даты/времени в текст с расширенными возможностями форматирования
используется функция FormatDateTime .
function FormatDateTime(const Format: string; DateTime: TDateTime): string;
где:
Format – формат строки;
DateTime – дата и время (количество дней, прошедших с 30
декабря 1899 года).
Поддерживаются следующие описатели формата строки Format :
c – дата и время в формате число.месяц.год
час:минута:секунда (например, '1.01.2127
1:08:04');
d – число месяца без нуля в первом разряде (1 … 31);
dd – число месяца с нулем в первом разряде (01 … 31);
ddd – сокращенное название дня недели (Пн … Вс);
dddd – полное название дня недели (понедельник … воскресенье);
ddddd – дата в сокращенном формате число.месяц.год
(например, '04.05.2096');
dddddd – дата в полном формате число месяц год
(например, '4 Май 2096 год');
g – отображает период/эру в виде аббревиатуры с 1.01.1601 г.
(только для японской и тайваньской локалей);
gg – отображает период/эру как полное название с 1.01.1601 г.
(только для японской и тайваньской локалей);
e – отображает год текущего периода/эры в виде числа без
начального нуля с 1.01.1601 г. (только для японской, корейской и тайваньской
локалей) (0 … 99);
ee – отображает год текущего периода/эры в виде числа с
начальным нулем с 1.01.1601 г. (только для японской, корейской и тайваньской
локалей) (00 … 99);
m – месяц в виде числа без нуля в первом разряде (1 … 12);
mm – месяц в виде числа с нулем в первом разряде (01 … 12);
mmm – сокращенное название месяца (янв … дек);
mmmm – полное название месяца (Январь … Декабрь);
yy – год из двух цифр (00 … 99);
yyyy – год из четырех цифр (0000 … 9999);
h – часы без нуля в первом разряде (0 … 23);
hh – часы с нулем в первом разряде (00 … 23);
n – минуты без нуля в первом разряде (0 … 59);
nn – минуты с нулем в первом разряде (00 … 59);
s – секунды без нуля в первом разряде (0 … 59);
ss – секунды с нулем в первом разряде (00 … 59);
z – миллисекунды без нуля в первом разряде (0 … 999);
zzz – миллисекунды с нулем в первом разряде (000 … 999);
t – сокращенный формат времени час:минута
(например, '9:02');
tt – полный формат времени час:минута:секунда
(например, '4:08:00');
am/pm – обозначение времени в 12-часовом формате до и после
полудня (до полудня показываются символы 'am',
после – 'pm');
a/p – обозначение времени в 12-часовом формате до и после
полудня (до полудня показывается символ 'a',
после – 'p');
ampm – обозначение времени в 12-часовом формате до и после
полудня (выводит в зависимости от настроек формата операционной системы).
Например,
FormatDateTime('dd.mm.yyyy hh:nn:ss am/pm',
Now) выведет '01.01.2016 08:00:00 am';
FormatDateTime('Сегодня dddd, dddddd. tt',
Now) выведет 'Сегодня пятница, 1 Январь 2016 год.
8:00:00'.
2. Проверка правильности введения даты
Перед преобразованием года, месяца и дня в формат TDateTime (переменная
Date ) функция TryEncodeDate контролирует корректность
значений в параметрах Year , Month и Day .
Если в параметре ошибка (например, указан 13-й месяц), функция вернет
false; а в случае
удачи – true,
и результат преобразования внесет в параметр Date .
function TryEncodeDate(Year, Month, Day: Word; out Date: TDateTime): Boolean;
где:
Year – год;
Month – месяц;
Day – день;
Date – полученная дата.
Например,
TryEncodeDate(2015, 2, 29, Date) выведет
false
(в феврале 2015 года – 28 дней);
TryEncodeDate(2016, 5, 1, Date) выведет
true, а значение
Date станет равным '42491'.
3. Объединение года, месяца и дня в дату
Функция EncodeDate конвертирует год, месяц и день в дату в формате
TDateTime .
function EncodeDate(Year, Month, Day: Word): TDateTime;
где:
Year – год;
Month – месяц;
Day – день.
Например,
EncodeDate(2012, 9, 30) выведет
'41182';
EncodeDate(2089, 11, 31) выдаст аварийную
ошибку (31 ноября не существует).
4. Разделение даты на год, месяц и день
Процедура DecodeDate конвертирует дату в формате TDateTime
в год, месяц и день.
procedure DecodeDate(const DateTime: TDateTime; var Year, Month, Day: Word);
где:
DateTime – исходная дата;
Year – год;
Month – месяц;
Day – день.
Например,
DecodeDate(48247, Year, Month, Day) извлечет
следующие значения:
Year – 2032;
Month – 2;
Day – 3.
5. Проверка правильности введения времени
Перед преобразованием числовых значений часа, минуты, секунды и миллисекунды в
формат TDataTime (переменная Time ) функция
TryEncodeTime проверяет корректность значений в параметрах
Hour , Min , Sec и MSec .
В случае ошибки (например, указано 60 минут) функция вернет
false; а в случае
удачи – true,
и результат преобразования внесет в параметр Time .
function TryEncodeTime(Hour, Min, Sec, MSec: Word; out Time: TDateTime): Boolean;
где:
Hour – часы;
Min – минуты;
Sec – секунды;
MSec – миллисекунды;
Time – полученное время.
Например,
TryEncodeTime(24, 8, 60, 984, Time) выведет
false (24 –
неверное количество часов /0 … 23/; 60 – неверное количество секунд
/0 … 59/);
TryEncodeTime(23, 51, 37, 687, Time) выведет
true, а значение
Time станет равным '0,994186'
(округленно).
6. Объединение часов, минут, секунд и миллисекунд во время
Функция EncodeTime конвертирует часы, минуты, секунды и миллисекунды во
время в формате TDateTime .
function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
где:
Hour – часы;
Min – минуты;
Sec – секунды;
MSec – миллисекунды.
Например,
EncodeTime(22, 47, 36, 1) выведет
'0,949722' (округленно);
EncodeTime(14, 9, 58, 1000) выдаст аварийную
ошибку (количество миллисекунд должно быть строго меньше 1000).
7. Разделение времени на часы, минуты, секунды и миллисекунды
Процедура DecodeTime конвертирует время в формате TDateTime
в часы, минуты, секунды и миллисекунды.
procedure DecodeTime(const DateTime: TDateTime; var Hour, Min, Sec, MSec: Word);
где:
DateTime – исходное время;
Hour – часы;
Min – минуты;
Sec – секунды;
MSec – миллисекунды.
Например,
DecodeTime(0.28435, Hour, Min, Sec, MSec)
извлечет следующие значения:
Hour – 6;
Min – 49;
Sec – 27;
MSec – 840.
8. День недели
Функция DayOfWeek возвращает день недели из значения
TDateTime . Возвращаемое функцией значение находится в промежутке между
1 и 7, где первым днем недели является воскресенье, последним (седьмым) –
суббота.
function DayOfWeek(const DateTime: TDateTime): Word;
где:
Например,
DayOfWeek(EncodeDate(2025, 6, 7)) выведет
'7' (суббота);
DayOfWeek(EncodeDate(2025, 6, 8)) выведет
'1' (воскресенье).
Примечание. Если хотите, чтобы первым днем недели
считался понедельник, используйте функцию DayOfTheWeek вместо функции
DayOfWeek , расположенная в модуле DateUtils .
9. Високосный год
Функция IsLeapYear показывает, является ли указаный год високосным.
function IsLeapYear(Year: Word): Boolean;
где:
Например,
IsLeapYear(2000) выведет
true;
IsLeapYear(2100) выведет
false.
Модуль DateUtils
Рассмотрим некоторые процедуры и функции по работе с датой и временем из модуля
DateUtils .
10. Проверка правильности введения даты и времени
Перед преобразованием года, месяца и дня в формат TDateTime (переменная
AValue ) функция TryEncodeDateTime контролирует корректность
значений в параметрах AYear , AMonth , ADay ,
AHour , AMinute , ASecond и
AMilliSecond . Если в параметре ошибка, функция вернет
false; а в случае
удачи – true,
и результат преобразования внесет в параметр AValue .
function TryEncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; out AValue: TDateTime): Boolean;
где:
AYear – год;
AMonth – месяц;
ADay – день;
AHour – часы;
AMinute – минуты;
ASecond – секунды;
AMilliSecond – миллисекунды;
AValue – полученные дата и время.
Например,
TryEncodeDateTime(2000, 6, 31, 14, 15, 16, 17, Value)
выведет false
(в июне – 30 дней);
TryEncodeDateTime(2008, 1, 2, 3, 4, 5, 6, Value)
выведет true, а
значение Value станет равным
'39449,1278357' (округленно).
11. Объединение года, месяца, дня, часов, минут, секунд и миллисекунд в дату и время
Функция EncodeDateTime конвертирует год, месяц, день, часы, минуты,
секунды и миллисекунды в дату и время в формате TDateTime .
function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;
где:
AYear – год;
AMonth – месяц;
ADay – день;
AHour – часы;
AMinute – минуты;
ASecond – секунды;
AMilliSecond – миллисекунды.
Например,
EncodeDateTime(2018, 12, 7, 15, 0, 0, 0)
выведет '43441,625';
EncodeDateTime(2046, 2, 8, 24, 0, 0, 0)
выдаст аварийную ошибку (количество часов должно быть строго меньше 24).
12. Разделение даты и времени на год, месяц, день, часы, минуты, секунды и миллисекунды
Процедура DecodeDateTime конвертирует дату и время в формате
TDateTime в год, месяц, день, часы, минуты, секунды и миллисекунды.
procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word);
где:
AValue – исходные дата и время;
AYear – год;
AMonth – месяц;
ADay – день;
AHour – часы;
AMinute – минуты;
ASecond – секунды;
AMilliSecond – миллисекунды.
Например,
DecodeDateTime(78343.24935742, Year, Month, Day, Hour,
Min, Sec, MSec) извлечет следующие значения:
Year – 2114;
Month – 6;
Day – 29;
Hour – 5;
Min – 59;
Sec – 4;
MSec – 481.
13. Количество дней в году
Функции DaysInYear и DaysInAYear возвращают количество
дней в году.
function DaysInYear(const AValue: TDateTime): Word;
function DaysInAYear(const AYear: Word): Word;
где:
AValue – дата;
AYear – год.
Например,
DaysInYear(EncodeDate(2011, 8, 31)) выведет
'365';
DaysInAYear(2012) выведет
'366'.
14. Количество дней в месяце
Функции DaysInMonth и DaysInAMonth возвращают количество
дней в месяце.
function DaysInMonth(const AValue: TDateTime): Word;
function DaysInAMonth(const AYear, AMonth: Word): Word;
где:
AValue – дата;
AYear – год;
AMonth – месяц.
Например,
DaysInMonth(EncodeDate(2073, 3, 23)) выведет
'31';
DaysInAMonth(2100, 2) выведет
'28'.
15. Количество недель в году
Функции WeeksInYear и WeeksInAYear возвращают количество
недель в году.
function WeeksInYear(const AValue: TDateTime): Word;
function WeeksInAYear(const AYear: Word): Word;
где:
AValue – дата;
AYear – год.
Например,
WeeksInYear(EncodeDate(2095, 2, 15)) выведет
'52';
WeeksInAYear(2048) выведет
'53'.
Примечание. Данные функции возвращают значение
'53' в том случае, если дата 1 января выпадает на
четверг (или в среду, если год високосный). Во всех случаях –
'52'.
16. Начало календарного года
Функции StartOfTheYear и StartOfAYear возвращают дату
начала года (1 января указанного года), значение времени устанавливается в
00:00:00.000.
function StartOfTheYear(const AValue: TDateTime): TDateTime;
function StartOfAYear(const AYear: Word): TDateTime;
где:
AValue – дата;
AYear – год.
Например,
StartOfTheYear(EncodeDate(2060, 4, 6)) выведет
'58441' (1 января 2060 год 00:00:00.000);
StartOfAYear(2000) выведет
'36526' (1 января 2000 год 00:00:00.000).
17. Конец календарного года
Функции EndOfTheYear и EndOfAYear возвращают дату
окончания года (31 декабря указанного года), значение времени устанавливается в
23:59:59.999.
function EndOfTheYear(const AValue: TDateTime): TDateTime;
function EndOfAYear(const AYear: Word): TDateTime;
где:
AValue – дата;
AYear – год.
Например,
EndOfTheYear(EncodeDate(2060, 4, 6)) выведет
'58806,9999999' (31 декабря 2060 год 23:59:59.999);
EndOfAYear(2000) выведет
'36891,9999999' (31 декабря 2000 год 23:59:59.999).
18. Начало календарного месяца
Функции StartOfTheMonth и StartOfAMonth возвращают дату
начала месяца (первый день указанного месяца), значение времени устанавливается в
00:00:00.000.
function StartOfTheMonth(const AValue: TDateTime): TDateTime;
function StartOfAMonth(const AYear, AMonth: Word): TDateTime;
где:
AValue – дата;
AYear – год;
AMonth – месяц.
Например,
StartOfTheMonth(EncodeDate(2142, 7, 3)) выведет
'88572' (1 июля 2142 год 00:00:00.000);
StartOfAMonth(2089, 3) выведет
'69093' (1 марта 2089 год 00:00:00.000).
19. Конец календарного месяца
Функции EndOfTheMonth и EndOfAMonth возвращают дату
окончания месяца (последний день указанного месяца), значение времени
устанавливается в 23:59:59.999.
function EndOfTheMonth(const AValue: TDateTime): TDateTime;
function EndOfAMonth(const AYear, AMonth: Word): TDateTime;
где:
AValue – дата;
AYear – год;
AMonth – месяц.
Например,
EndOfTheMonth(EncodeDate(2142, 7, 3)) выведет
'88602,9999999' (31 июля 2142 год 23:59:59.999);
EndOfAMonth(2089, 3) выведет
'69123,9999999' (31 марта 2089 год 23:59:59.999).
20. Начало календарной недели
Функции StartOfTheWeek и StartOfAWeek возвращают дату
начала недели (первый день недели), значение времени устанавливается в
00:00:00.000.
function StartOfTheWeek(const AValue: TDateTime): TDateTime;
function StartOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word = 1): TDateTime;
где:
AValue – дата;
AYear – год;
AWeekOfYear – неделя года (в диапазоне 1 … 53).
ADayOfWeek – смещение относительно первого дня недели
(в диапазоне 1 … 7) (необязательный параметр).
Например,
StartOfTheWeek(EncodeDate(2038, 9, 5)) выведет
'50647' (понедельник, 30 августа 2038 год
00:00:00.000);
StartOfAWeek(1970, 1) выведет
'25566' (понедельник, 29 декабря 1969 год
00:00:00.000).
StartOfAWeek(1971, 1) выведет
'25937' (понедельник, 4 января 1971 год
00:00:00.000).
StartOfAWeek(1971, 1, 7) выведет
'25943' (воскресенье, 10 января 1971 год
00:00:00.000).
Примечание. Как видно из примеров, дата начала
первой недели календарного года (понедельник) зависит от дня недели 1 января.
21. Конец календарной недели
Функции EndOfTheWeek и EndOfAWeek возвращают дату
окончания недели (последний день недели), значение времени устанавливается в
23:59:59.999.
function EndOfTheWeek(const AValue: TDateTime): TDateTime;
function EndOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word = 7): TDateTime;
где:
AValue – дата;
AYear – год;
AWeekOfYear – неделя года (в диапазоне 1 … 53).
ADayOfWeek – смещение относительно последнего дня недели
(в диапазоне 1 … 7) (необязательный параметр).
Например,
EndOfTheWeek(EncodeDate(2038, 8, 30)) выведет
'50653,9999999' (воскресенье, 5 сентября 2038 год
23:59:59.999);
EndOfAWeek(1970, 53) выведет
'25936,9999999' (воскресенье, 3 января 1971 год
23:59:59.999).
EndOfAWeek(1969, 52) выведет
'25565,9999999' (воскресенье, 28 декабря 1969 год
23:59:59.999).
EndOfAWeek(1969, 52, 1) выведет
'25559,9999999' (понедельник, 22 декабря 1969 год
23:59:59.999).
22. Порядковый номер дня года
Функция DayOfTheYear возвращает порядковый номер дня с начала года
(количество дней между значением, указаным в TDateTime и 31 декабря
предыдущего года).
function DayOfTheYear(const AValue: TDateTime): Word;
где:
Например,
DayOfTheYear(EncodeDate(2096, 6, 27)) выведет
'179' (179-й день 2096-го года).
Проверка: 31 + 29 + 31 + 30 + 31 + 27 = 179.
23. Порядковый номер недели года
Функция WeekOfTheYear возвращает порядковый номер недели с начала года.
function WeekOfTheYear(const AValue: TDateTime): Word;
function WeekOfTheYear(const AValue: TDateTime; var AYear: Word): Word;
где:
AValue – дата;
AYear – год.
Например,
WeekOfTheYear(EncodeDate(2019, 4, 21), Year)
выведет '16' (16-я неделя 2019-го года), а
значение Year станет равным '2019';
WeekOfTheYear(EncodeDate(2157, 1, 1), Year)
выведет '53' (53-я неделя 2156-го года), а
значение Year станет равным '2156'
(1 января 2157 года – суббота);
WeekOfTheYear(EncodeDate(2075, 12, 31))
выведет '1' (1-я неделя 2076-го года)
(31 декабря 2075 года – вторник).
24. Конвертация григорианского и юлианского дней
Функция DateTimeToJulianDate преобразовает значение
TDateTime в соответствующую юлианскую дату. Функция
JulianDateToDateTime преобразовает юлианскую дату в соответствующее
значение TDateTime .
Юлианская дата – это количество дней, включая дробные дни, с 4713 г. до н. э.
1 января, полдень по Гринвичу. Юлианские даты используются астрономами, геофизиками
и другими, кому нужна однозначная система датирования, основанная на продолжающемся
подсчете дней.
function DateTimeToJulianDate(const AValue: TDateTime): Double;
где:
function JulianDateToDateTime(const AValue: Double): TDateTime;
где:
Например,
DateTimeToJulianDate(EncodeDateTime(1842, 11, 2, 7,
32, 54, 555)) выведет '2394141,8145203'
(округленно);
JulianDateToDateTime(2518809.2942958) выведет
'103790.7942958' (29 февраля 2184 год
19:03:47.157).
Примечание. К сожалению, до 15 октября 1582 года
имеются расхождения. Для того, чтобы вычислить истинные значения до указанной даты,
необходимо учитывать григорианскую реформу календаря. Такие функции описаны,
например, в книге О.Монтенбрука, Т.Пфлегера "Астрономия на персональном компьютере".
25. Конвертация даты Unix
Функция DateTimeToUnix преобразовает значение TDateTime в
соответствующую кодировку Unix/Linux той же даты и времени. Функция
UnixToDateTime преобразовает кодировку Unix/Linux значения даты и
времени в соответствующее значение TDateTime .
Значения даты и времени в Unix/Linux кодируются как количество секунд, прошедших с
полуночи 1 января 1970 года.
function DateTimeToUnix(const AValue: TDateTime): Int64;
где:
function UnixToDateTime(const AValue: Int64): TDateTime;
где:
Например,
DateTimeToUnix(EncodeDateTime(2005, 6, 14, 11, 54,
13, 843)) выведет '1118750054';
UnixToDateTime(2307360941) выведет
'52274.5664468' (округленно) (12 февраля 2043
год 13:35:41.000).
Авторский модуль
В этом разделе предлагаются авторские разработки.
26. Порядковый номер недели года
Наверно заметили, что функция WeekOfTheYear не совсем корректно
работает: для 1 января функция может выдать значения
'1', либо '52'.
То же самое и для 31 декабря. Поэтому предлагаю свой вариант: 1-я неделя начинается
с 1 января (день недели не имеет значения), а 52-я (53-я) – только для 31
декабря.
function WeekOfTheYearNew(DateTime: TDateTime): word;
var Year, Month, Day, Week: word;
Date1: TDateTime;
begin
DecodeDate(DateTime, Year, Month, Day);
Date1:=EncodeDate(Year, 1, 1);
Week:=DayOfTheWeek(Date1);
Date1:=Date1-Week+1;
Week:=Trunc(DateTime-Date1);
Result:=Week div 7+1;
end;
где:
DateTime – исходная дата.
Например,
WeekOfTheYearNew(EncodeDate(2087, 6, 27))
выведет '26' (26-я неделя 2087-го года).
27. Перевод количества секунд в привычный нам формат
function FormatSecond(Sec: real): string;
var d, ch, min, s, ms: integer;
begin
ms:=Trunc(Frac(Sec)*1000);
Sec:=Trunc(Sec);
s:=Trunc(Sec) mod 60;
Sec:=Trunc(Sec/60);
min:=Trunc(Sec) mod 60;
Sec:=Trunc(Sec/60);
ch:=Trunc(Sec) mod 24;
Sec:=Trunc(Sec/24);
d:=Trunc(Sec);
Result:='';
if d>0 then
Result:=Format('%d дн. ', [d]);
Result:=Format('%s%d:%.2d:%.2d', [Result, ch, min, s]);
if ms>0 then
Result:=Format('%s,%.3d', [Result, ms]);
end;
где:
Например,
FormatSecond(82926) выведет
'23:02:06';
FormatSecond(658745.008) выведет
'7 дн. 14:59:05,008'.
28. Часовой пояс
function TimeZone: real;
var lp: TTimeZoneInformation;
begin
GetTimeZoneInformation(lp);
Result:=-lp.Bias/60;
end;
Примечание 1. Выводит часовой пояс в зависимости
от настроек компьютера (например, '3').
Примечание 2. Список часовых поясов можно найти в
разделе "Чтение системного реестра" во 2 пункте
"Список часовых поясов".
29. Вычисление даты Пасхи
function Easter(Year: integer): TDateTime;
var a, b, c: integer;
begin
a:=Year mod 19;
b:=Year mod 4;
c:=Year mod 7;
a:=(19*a + 15) mod 30;
b:=(2*b + 4*c + 6*a + 6) mod 7;
a:=a+b;
b:=-2 + Year div 100 - Year div 400;
if TryEncodeDate(Year, 3, 22, Result) then
Result:=Result+a+b else
Result:=0;
end;
где:
Например,
FormatDateTime('c', Easter(2016)) выведет
'01.05.2016'.
Ниже статьи имеется небольшая программа, позволяющая вычислить даты Пасхи.
|