Здравствуйте, многим известно, что до Нового Года осталось считанные дни, так вот к чему данная статья. Данная статья пока что еще не будет итогом работы моего блога в течении этого года и не будет нести поздравительный, пока еще что характер. А статья моя о том, которая поможет программно вычислить сколько до Нового Года осталось времени. Вычислять оно будет не сколько дней, а вот в таком формате:
До Нового Года осталось 0 месяцев 20 дней 3 часа 25 минут 43 секунды и каждую секунду естественно будет происходить обновление. Такое конечно можно сделать с любым праздником, с любой датой, которая только Вам понравится. Вы возможно часто замечали на сайтах есть уже давно такие скрипты, на том же сайте Delphi в Internet также есть подобный счетчик, который показывает сколько осталось до окончания конкурса, который организовал данный сайт. Вот эта программка и предназначалась для того конкурса, не вся конечно, то есть это была бы не программка, а я хотел сделать скринсейвер, который закончен только на половину и эта надпись до Нового Года осталось столько-то, присутствует в моем скринсейвере, но учеба на водительское удостоверение, подготовка к сессии не дало мне до конца довести проект. Но зато теперь я с водительским удостоверением. Конечно очень хотел поучаствовать в конкурсе, но не судьба, ничего как-нибудь переживем, думаю еще не мало будет подобных конкурсов. Ну так вот вернемся к нашей программке. Что нам для реализации данной программы понадобиться — это только TTimer. Таймер нам необходим для того, чтобы каждую секунду обновлять. Конечно тут немного я неправильно сделал, проблема у меня возникла в том, что необходимо было определять сколько дней в текущем месяце, чтобы подсчитать сколько дней осталось до Нового Года и тут у меня возникла проблема с високосным годом, но эту проблему я решил с помощью функции IsLeapYear, после этого я просто делал проверку на то, какой сейчас месяц и в переменной хранил количество дней в месяце, в других месяцах может быть только 30 или 31 день. Только после этого как я все уже подготовил, я понял, что я очень глупо поступил. Ведь в Delphi есть замечательная функция, которая возвращает количество дней в указанном году и месяце. Но ничего я уже не стал делать второй вариант с данной функцией, так что обойдемся без нее.
Но про данную функцию скажу - DaysInAMonth, у данной функции два параметра типа Word. Первый — год и второй параметр — месяц, для которого вычислять количество дней. Все просто как видите, применение следующее
procedure TForm1.FormCreate(Sender: TObject);
begin
caption:=Inttostr(DaysInAMonth(2010,12));
end;
В результате вернется результат — 31. И действительно ведь в декабре 2010 года 31 день =).
Ну что теперь вернемся к нашей программе. После того как мы определили сколько дней в месяце, то мы спокойно мы просто вычисляем результат. А вычисляется он просто, от 12 отнимаем номер текущего месяца, от текущего количества дней в месяце отнимаем текущее число, от 24 отнимаем количество часов текущее и тоже самое делаем с минутами и секундами. Все просто, может я как-то немного ошибся в расчетах, так что не судите строго. Вот я написал какую функцию
function TForm1.GetDaysToNewYear(Dates,Times: String): String;
var
d,m,y,h,s,minut:String;
daym,hous,minutes,second:Integer;
begin
d:=Copy(Dates,1,pos('.',Dates)-1);
Delete(Dates,1,pos('.',Dates));
m:=Copy(Dates,1,pos('.',Dates)-1);
Delete(Dates,1,pos('.',Dates));
y:=Dates;
h:=Copy(Times,1,pos(':',Times)-1);
Delete(Times,1,pos(':',Times));
minut:=Copy(Times,1,pos(':',Times)-1);
Delete(Times,1,pos(':',Times));
s:=Times;
if h='0' then
hous:=24
else
hous:=StrToInt(h);
if minut='0' then
minutes:=1
else
minutes:=StrToInt(minut);
second:=StrToInt(s);
if m='2' then
begin
daym:=28;
if IsLeapYear(StrToInt(y)) then daym:=29;
end;
if (((StrToInt(m) mod 2)<>0) and (StrToInt(m)<8)) or (m='8')
or (m='12') or (m='10') then
daym:=31;
if (((StrToInt(m) mod 2)=0) and (StrToInt(m)<8))
or (m='9') or (m='11') then
daym:=30;
result:='До Нового Года осталось '+IntToStr(12-StrToInt(m))+
' месяцев'+IntToStr(daym-StrToInt(d))+' дней'+IntToStr(24-hous)+
' часов'+IntToStr(60-minutes)+' минут'+IntToStr(60-second)+' секунд';
end;
Применять данную функцию стоит в следующем формате
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Caption:=GetDaysToNewYear(FormatDateTime('dd.m.yyyy',Date),FormatDateTime('h:m:s',Time));
end;
Как видите в данной функции происходит разбиение времени и даты на отдельные части. То есть разбиваем часы, минуты, секунды и так далее на разные части и затем просто вычисляем сколько времени осталось.
Исходники можно скачать тут