FAQ VCL
Дата и время

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как определить день недели?

procedure TForm1.Button1Click(Sender: TObject);
begin
   case DayOfWeek( date ) of
      1: Form1.Caption := 'Воскресенье';
      2: Form1.Caption := 'Понедельник';
      3: Form1.Caption := 'Вторник';
      4: Form1.Caption := 'Среда';
      5: Form1.Caption := 'Четверг';
      6: Form1.Caption := 'Пятница';
      7: Form1.Caption := 'Суббота';
   end;
end;


Как узнать номер недели данного дня в году?

// Способ первый
function WeekOfYear(ADate: TDateTime) : word;
var 
  day: word; 
  month: word;
  year: word; 
  FirstOfYear: TDateTime; 
begin 
   DecodeDate( ADate, year, month, day );
   FirstOfYear := EncodeDate( year, 1, 1 );
   Result := Trunc( ADate - FirstOfYear ) div 7 + 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage( IntToStr( WeekOfYear( Date ) ) );
end;

// Способ второй
function WeekOfYear(ADate: TDateTime) : word;
var
  Year: word;
  Month: word;
  Day: word;
begin
  DecodeDate( ADate + 4 - DayOfWeek( ADate + 6 ), Year, Month, Day );
  Result := 1 + Trunc( ( ADate - EncodeDate( Year, 1, 5 ) +
            DayOfWeek( EncodeDate( Year, 1, 3 ) ) ) / 7 );
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage( IntToStr( WeekOfYear( Date ) ) );
end;

// Способ третий
uses
  DateUtils;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(IntToStr(WeekOfTheYear(Date)));
end;


Как посчитать возраст человека?

// Способ первый
function CalculateAge(Birthday, CurrentDate: TDate): Integer;  
var
  Month, Day, Year,
  CurrentYear,
  CurrentMonth,
  CurrentDay: Word;
begin  
   DecodeDate( Birthday, Year, Month, Day );
   DecodeDate( CurrentDate, CurrentYear, CurrentMonth, CurrentDay );
   if ( Year = CurrentYear ) and ( Month = CurrentMonth ) and ( Day = CurrentDay ) then
      Result := 0;
   else
   begin
      Result := CurrentYear - Year;
      if ( Month > CurrentMonth ) then
         Dec( Result )
      else
      begin
         if Month = CurrentMonth then
            if ( Day > CurrentDay ) then
               Dec( Result );
      end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Caption := Format( 'Ваш возраст %d',
              [CalculateAge( StrToDate( '28.08.1979' ), Date )] );
end;

// Способ второй
function AgeStr( aDate: TDateTime ): string;
var
  DaysOld: Double;
  Years, Months: Integer;
begin
   DaysOld := Date - aDate;
   Years := Trunc( DaysOld / 365.25 );
   DaysOld := DaysOld - ( 365.25 * Years );
   Months := Trunc( DaysOld / 30.41 );
   Result := Format( '%d лет, %d месяцев', [Years, Months] );
end;


Как определить - високосный год или нет?

// Способ первый
function LeapYear( Year: Word ): boolean;
begin
   if ( Year mod 4 = 0 ) and
      ( ( Year mod 100 <> 0 ) or ( Year mod 400 = 0 ) ) then
      Result := true
   else
      Result := false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if LeapYear( 2004 ) then
      ShowMessage( 'Год високосный' )
   else
      ShowMessage( 'Обычный год' );
end;

// Способ второй
function LeapYear( Year: Word ): boolean;
begin
   Result := ( Year mod 4 = 0 ) and ( ( Year mod 100 <> 0 ) or ( Year mod 400 = 0 ) );
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if LeapYear( 2004 ) then
      ShowMessage( 'Год високосный' )
   else
      ShowMessage( 'Обычный год' );
end;

// Способ третий
procedure TForm1.Button1Click(Sender: TObject);
begin
   if IsLeapYear( 2004 ) then
      ShowMessage( 'Год високосный' )
   else
      ShowMessage( 'Обычный год' );
end;


Как узнать количество дней в месяце?

// Способ первый
function DayOfMonth(dt: TDate): integer;
var
  Year, Month, Day: word;
  vis: boolean;
begin
   DecodeDate(dt, Year, Month, Day);
   Result := Month;
   if (Year mod 4 = 0) and
      ((Year mod 100 <> 0) or (Year mod 400 = 0)) then
      vis := true
   else
      vis := false;
   case Month of
      1, 3, 5, 7, 8, 10, 12: Result := 31;
      4, 6, 9, 11: Result := 30;
      2: if vis then
            Result := 29
         else
            Result := 28;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(IntToStr(DayOfMonth(Now)));
end;

// Способ второй
function DaysOfMonth(mm, yy: Integer): Integer;
begin 
   if mm = 2 then
   begin
      Result := 28;
      if IsLeapYear(yy) then Result := 29;
   end
   else
   begin
      if mm < 8 then
      begin
         if mm mod 2 = 0 then
            Result := 30
         else
            Result := 31;
      end
      else
      begin
         if mm mod 2 = 0 then
            Result := 31
         else
            Result := 30;
      end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(IntToStr(DaysOfMonth(2, 2004)));
end;

// Способ третий
function DaysPerMonth(AMonth, AYear: Integer): Integer;
const
  DaysInMonth: array[1..12] of Integer =
    (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
   Result := DaysInMonth[AMonth];
   if (AMonth = 2) and IsLeapYear(AYear) then
      Inc(Result);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage( IntToStr( DaysPerMonth( 9, 2017 ) ) );
end;

// Способ четвертый
uses
  Math;

// Количество дней в месяце для невисокосного года
function DaysOfMonthForNonLeapLears(x: Byte): Byte;
begin
   Result := 28 + (x + Floor(x/8)) mod 2 + 2 mod x + 2 * Floor(1/x);
end;

// Количество дней в месяце для високосного года
function DaysOfMonthForLeapLears(x: Byte): Byte;
begin
   Result := 28 + (x + Floor(x/8)) mod 2 + 2 mod x + 2 * Floor(1/x) + (not x and $D) div $D;
end;


Как получить список часовых поясов?

uses
  {...,} Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
  reg : TRegistry;
  ts : TStrings;
  i : integer;
begin
   reg := TRegistry.Create;
   reg.RootKey := HKEY_LOCAL_MACHINE;
   reg.OpenKey( 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones', false );
   if reg.HasSubKeys then
   begin
      ts := TStringList.Create;
      reg.GetKeyNames( ts );
      reg.CloseKey;
      for i := 0 to ts.Count-1 do
      begin
         reg.OpenKey( 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\' + ts.Strings[i], false );
         Memo1.Lines.Add( ts.Strings[i] );
         Memo1.Lines.Add( reg.ReadString( 'Display' ) );
         Memo1.Lines.Add( reg.ReadString( 'Std' ) );
         Memo1.Lines.Add( reg.ReadString( 'Dlt' ) );
         Memo1.Lines.Add( '----------------------');
         reg.CloseKey;
      end;
      ts.Free;
   end
   else
      reg.CloseKey;
   reg.Free;
end;


Как узнать текущую дату и время по Гринвичу?

// Способ первый
procedure TForm1.Button1Click(Sender: TObject);
var
  lt, st: TSystemTime;
begin
   GetLocalTime(lt);
   GetSystemTime(st);
   with lt do
      Memo1.Lines.Add(Format('Local Time = %.2d.%.2d.%.2d %d:%.2d:%.2d',
                             [wDay, wMonth, wYear, wHour, wMinute, wSecond]));
   with st do
      Memo1.Lines.Add(Format('GMT Time = %.2d.%.2d.%.2d %d:%.2d:%.2d',
                             [wDay, wMonth, wYear, wHour, wMinute, wSecond]));
end;

// Способ второй
function GetDateTimeGTM(AValue: TDateTime; AZoneMin: Integer = 0): TDateTime;
var
  TZ: _TIME_ZONE_INFORMATION;
  corMinutes: Integer;
begin
   GetTimeZoneInformation(TZ);
   if TZ.Bias + AZoneMin  < 0 then
      corMinutes:= (TZ.Bias + AZoneMin) * -1
   else
      corMinutes:= TZ.Bias + AZoneMin ;
   if TZ.Bias + AZoneMin  < 0 then
      Result := AValue + EncodeTime(corMinutes div 60, corMinutes mod 60, 0, 0) * -1
   else
      Result := AValue + EncodeTime(corMinutes div 60, corMinutes mod 60, 0, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(DateTimeToStr(GetDateTimeGTM(Now)));
end;


Как получить дату последнего дня в месяце?

// Способ первый
function LastDayOfMonth(lmDate: TDateTime): TDateTime;
var
  y, m, d: Word;
begin
   DecodeDate(lmDate, y, m, d);
   m := m + 1;
   if m = 12 then
   begin
      y := y + 1;
      m := 1;
   end;
   Result := EncodeDate(y, m, 1) - 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(DateToStr(LastDayOfMonth(Now)));
end;

// Способ второй
function LastMDay(lmDate: TDateTime): TDateTime;

  function FirstMDay(fmDate: TDateTime): TDateTime;
  var
    fiYear, fiMonth, fiDay: Word;
  begin
    if fmDate = 0 then
      Result := fmDate
    else
    begin
      DecodeDate(fmDate, fiYear, fiMonth, fiDay);
      Result := EncodeDate(fiYear, fiMonth, 1);
    end;
  end;

begin
  if lmDate = 0 then
    Result := lmDate
  else
    Result := FirstMDay(FirstMDay(lmDate)+35)-1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(DateToStr(LastMDay(Now)));
end;


Как получить номер дня в году?

// Способ первый
function GetDays( ADate: TDate ): Extended;
var
  FirstOfYear: TDateTime;
begin
   FirstOfYear := EncodeDate( StrToInt( FormatDateTime( 'yyyy', Now ) ) - 1, 12, 31 );
   Result := ADate - FirstOfYear;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage( 'Сегодня ' + FloatToStr( GetDays( Date ) ) + ' день в году.' );
end;

// Способ второй
uses
  Math;

function GetDays( ADate: TDate ): Extended;
var
  N1, N2, N3: Integer;
  Year, Month, Day: Word;
begin
   DecodeDate( ADate, Year, Month, Day );
   N1 := Floor( 275 * Month / 9 );
   N2 := Floor( ( Month + 9 ) / 12 );
   N3 := ( 1 + Floor( ( Year - 4 * Floor( Year / 4 ) + 2 ) / 3 ) );
   Result := N1 - ( N2 * N3 ) + Day - 30;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage( 'Сегодня ' + FloatToStr( GetDays( Date ) ) + ' день в году.' );
end;


Как перевести григорианскую дату в юлианскую?

function DateToJD( DT: TDateTime ): Double;
var
  dD, dM, dY: Word;
  tH, tM, tS, tSS: Word;
begin
   DecodeDate( DT, dY, dM, dD );
   DecodeTime( DT, tH, tM, tS, tSS );
   // Внимание! Эта формула действует только для дат между 1801 и 2099.
   // Более отдалённые даты потребуют более сложных преобразований.
   Result := 1461 * ( dY + 4800 + ( dM - 14 ) / 12 ) / 4 +
             367 * ( dM - 2 - 12 * ( ( dM - 14 ) / 12 ) ) / 12 -
             3 * ( ( dY + 4900 + ( dM - 14 ) / 12 ) / 100 ) / 4 +
             dD - 32075;
   //Result := Trunc( Result ) + ( ( tH + ( ( tM/60 ) + tS ) / 60  ) - 12 ) / 24;
   Result := Trunc( Result ) + ( ( tH - 12 ) / 24 ) + ( tM / 1440 ) + ( tS / 86400 );
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  JD: Double;
begin
   JD := DateToJD( EncodeDate( 1970, 1, 1 ) + EncodeTime( 0, 0, 0, 0 ) );
   ShowMessage( FloatToStr( JD ) );
end;

При использовании материала - ссылка на сайт обязательна