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

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

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

Кстати, на ОС linux ubuntu также можно сделать такой счетчик дней до праздника. Но тут нужна среда разработки, например Lazarus

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

Автор статьи - Andrey53

Метки: , ,




К записи “Вычисляем дни до Нового Года” оставлено комментариев: 5.

  1. большой такой совет на будущий год (: — изучайте мануал. особенно в части модуля DateUtils, найдете для себя много нового для работы с датой/временем.

  2. awex:

    Еще один изобретатель велосипедов…
    1. DecodeDate !!
    2. type TDateTime = type Double !!!
    The integral part of a Delphi TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of the TDateTime value is fraction of a 24 hour day that has elapsed.

  3. John:

    Это нужно прямиком в govnokod.ru!

  4. Nil:

    ShowMessage (
    ‘До нового года осталось : ‘#13#10+
    ‘ ‘+IntToStr (DaysInYear (Date)-DaysBetween (Date, StartOfTheYear (Date)))+’ день(дня)(дней)’#13#10+
    ‘ ‘+IntToStr (MonthsBetween (Date, StartOfTheMonth (Date)))+’ мясяц(ев)’#13#10+
    ‘ ‘+IntToStr (HoursBetween (Date, EndOfTheYear (Date)))+’ час(ов)’#13#10+
    ‘ ‘+IntToStr (MinutesBetween (Date, EndOfTheYear (Date)))+’ минут(а)’
    );

  5. KoToSveen:


    var
    days, hours, minutes, seconds: integer;
    begin
    days := DaysBetween (EncodeDate(2017,1,1), Now());
    hours := HoursBetween (EncodeDate(2017,1,1), Now()) mod 24;
    minutes := MinutesBetween (EncodeDate(2017,1,1), Now()) mod 60;
    seconds := SecondsBetween (EncodeDate(2017,1,1), Now()) mod 60;

    label1.Caption :=
    'До Нового Года осталось ' +
    IntToStr(days) + ' дней, ' +
    IntToStr(hours) + ' часов, ' +
    IntToStr(minutes) + ' минут, ' +
    IntToStr(seconds) + ' секунд!!!';

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*