Вычисляем дни до Нового Года

6 минут на чтение

Здравствуйте, многим известно, что до Нового Года осталось считанные дни, так вот к чему данная статья. Данная статья пока что еще не будет итогом работы моего блога в течении этого года и не будет нести поздравительный, пока еще что характер. А статья моя о том, которая поможет программно вычислить сколько до Нового Года осталось времени. Вычислять оно будет не сколько дней, а вот в таком формате:

До Нового Года осталось 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;

Как видите в данной функции происходит разбиение времени и даты на отдельные части. То есть разбиваем часы, минуты, секунды и так далее на разные части и затем просто вычисляем сколько времени осталось.

Исходники можно скачать тут

Facebook Vk Ok Twitter LinkedIn Telegram

Похожие записи:

Не каждый человек способен освоить навыки программирования. Такая работа кажется очень сложной, а люди, умеющие её выполнять, воспринимаются некими странными сущностями, словно бы не от мира сего. Они погружены в расчеты и вычисления, коды и тестирования, прав...
Всем привет, опять же, пишу статью про ADO, а также по просьбе читателя моего блога, который попросил рассказать, как в БД можно работать с вычисляемыми полями (чтобы значение вычисляемого поля сразу менялось, при вводе нового значения), на примере БД — MS Acc...
Содержимое любого сайта периодически проверяют пауки — поисковые роботы. Они отслеживают появление нового контента, индексируют его, вносят в общую базу. При каждом посещении сайта боты создают датированный вебархив. Когда по какой-то причине владелец забрасыв...