iki tarih ve saat arasındaki ay gün ve saat farkı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
erdogan_ozkaya
Üye
Mesajlar: 798
Kayıt: 03 Eki 2007 01:00

iki tarih ve saat arasındaki ay gün ve saat farkı

Mesaj gönderen erdogan_ozkaya » 30 Ara 2017 03:10

Arkadaşlar,

İki tarih arasındaki ay gün saat farkını nasıl çıkartabilirim ?

"01.12.2017 11:00:00" - "20.12.2017 12:30:00"
"Kalan Zaman : 20 Gün 1 Saat 30 Dakika"
Bu sonucu nasıl alabilirim ?

Çeçitli konular baktım ama somut bir örnek bulamadım

aşağıdaki kod ile sadece gün farkını veriyor

Teşekkürler.

Kod: Tümünü seç

var
      Tarih1, Tarih2: Tdate;
      Yil, Ay, Gun: Integer;
begin
        Tarih1 := QRY1.FieldByName('BASLANGIC').Value;
        Tarih2 := QRY1.FieldByName('BITIS').Value;
        Yil := YearsBetween(Tarih2, Tarih1);

        Tarih2 := IncYear(Tarih2, - Yil);

        Ay := MonthsBetween(Tarih2, tarih1);
        Tarih2 := IncMonth(Tarih2, - Ay);
        Gun := DaysBetween(Tarih2, Tarih1);
        
        QRY1.FieldByName('KALAN_ZAMAN').Text:=Format('%d Yıl. %d Ay. %d Gün', [Yil, Ay, Gun]);
        

ertank
Üye
Mesajlar: 1111
Kayıt: 11 Eyl 2015 11:45

Re: iki tarih ve saat arasındaki ay gün ve saat farkı

Mesaj gönderen ertank » 30 Ara 2017 04:27

Merhaba,

Aşağıdaki gibi bir kod ile istediğinizi elde edebilirsiniz.

Kod: Tümünü seç

uses
  DateUtils;

function GetDateDifferenceInNumbers(const Date1, Date2: TDateTime): string;

  function GetMin(const Val1, Val2: Double): Double;
  begin
    if Val1 < Val2 then Exit(Val1) else Exit(Val2);
  end;

  function GetMax(const Val1, Val2: Double): Double;
  begin
    if Val1 > Val2 then Exit(Val1) else Exit(Val2);
  end;

var
  MinDate: TDateTime;
  MaxDate: TDateTime;
  Years: Integer;
  Months: Integer;
  Days: Integer;
  Hours: Integer;
  Minutes: Integer;
  Seconds: Integer;
begin
  if Date1 = Date2 then Exit('0');
  
  MinDate := GetMin(Date1, Date2);
  MaxDate := GetMax(Date1, Date2);

  Years := YearsBetween(MinDate, MaxDate);
  if Years > 0 then MinDate := IncYear(MinDate, Years);

  Months := MonthsBetween(MaxDate, MinDate);
  if Months > 0 then MinDate := IncMonth(MinDate, Months);

  Days := DaysBetween(MaxDate, MinDate);
  if Days > 0 then MinDate := IncDay(MinDate, Days);

  Hours := HoursBetween(MinDate, MaxDate);
  if Hours > 0 then MinDate := IncHour(MinDate, Hours);

  Minutes := MinutesBetween(MaxDate, MinDate);
  if Minutes > 0 then MinDate := IncMinute(MinDate, Minutes);

  Seconds := SecondsBetween(MaxDate, MinDate);


  Result := EmptyStr;
  if Years > 0 then Result := Years.ToString() + ' YIL';
  if Months > 0 then Result := Result + ' ' + Months.ToString() + ' AY';
  if Days > 0 then Result := Result + ' ' + Days.ToString() + ' GÜN';
  if Hours > 0 then Result := Result + ' ' + Hours.ToString() + ' SAAT';
  if Minutes > 0 then Result := Result + ' ' + Minutes.ToString() + ' DAKİKA';
  if Seconds > 0 then Result := Result + ' ' + Seconds.ToString() + ' SANİYE';
end;
Kod özellikle kendi GetMin() ve GetMax() fonksiyonlarını kullanıyor. Böylece iki fonksiyon için EXE boyutunu büyütecek Math ünitesini uses kısmına eklemeye gerek kalmamış oluyor.

Örnek fonksiyonun kullanımı aşağıdaki gibi olacaktır

Kod: Tümünü seç

  ShowMessage(GetDateDifferenceInNumbers(EncodeDateTime(2010, 01, 01, 11, 05, 47, 0),
                                         EncodeDateTime(2017, 12, 30, 16, 51, 14, 0)));
Gelen cevap ise aşağıdaki gibi olacaktır

Kod: Tümünü seç

7 YIL 11 AY 29 GÜN 5 SAAT 45 DAKİKA 27 SANİYE
Tarihler arası fark hesaplayan fonksiyonların tamamı parametre sırası gözetmez. Başka bir deyişle önce büyük tarih veya önce küçük tarih diye bir sıralaması yoktur.

Fonksiyon doğruluğunu aşağıdaki bağlantıyı kullanarak test edebilirsiniz.
https://www.timeanddate.com/date/durati ... 2=05&s2=47

erdogan_ozkaya
Üye
Mesajlar: 798
Kayıt: 03 Eki 2007 01:00

Re: iki tarih ve saat arasındaki ay gün ve saat farkı

Mesaj gönderen erdogan_ozkaya » 30 Ara 2017 08:08

hocam cevabınız için çok teşekkür ederim delphi7 de çalımadı :(

Val1 de hata veriyor.

if Val1 < Val2 then Exit(Val1) else Exit(Val2);

[Error] Unit1.pas(33): Missing operator or semicolon

Teşekkürler.

kerpeten
Üye
Mesajlar: 62
Kayıt: 26 May 2016 12:31

Re: iki tarih ve saat arasındaki ay gün ve saat farkı

Mesaj gönderen kerpeten » 30 Ara 2017 10:04

Esasen Delphi'de Date ve Time yapısı öyle düzenlenmiş ki bu işlemler çok kolaylaşmış. DateTime değişkeni aslında bir float değişken. Bunun ondalık kısımları Time'yi ve tamsayı kısımları ise Date'i göstermektedir. Tarihi 31.12.1899'dan başlatarak sayar, bu rakam da tamsayı kısmında yer alır. Fark ondalık olarak 0.5 ise sonuç 12:00:00 ya da diğer bir deyişle 12 saat demektir. Yani iki tarih ya da iki zaman arasındaki farkı bulmak için basit çıkartma yapılması kafidir.

Zaman Farkı = (Date2 + Time2) - (Date1 + Time1);

gibi.

Aynı şekilde iki tarih arasındaki günleri bulmak için Date2-Date1 yapmanız yetecektir. Ancak bulunan sonuçta kaç ay var diye sorarsanız bunu sonucu 30'a bölerek sizin bulmanız gerekecektir. Aynı şekilde yıl için de

ertank
Üye
Mesajlar: 1111
Kayıt: 11 Eyl 2015 11:45

Re: iki tarih ve saat arasındaki ay gün ve saat farkı

Mesaj gönderen ertank » 31 Ara 2017 12:18

erdogan_ozkaya yazdı:
30 Ara 2017 08:08
hocam cevabınız için çok teşekkür ederim delphi7 de çalımadı :(

Val1 de hata veriyor.

if Val1 < Val2 then Exit(Val1) else Exit(Val2);

[Error] Unit1.pas(33): Missing operator or semicolon

Teşekkürler.
Öncelikle o hata Val1 değil Exit komutunun sonunda noktalı virgül olmadığı için ortaya çıkan bir hata. Delphi 7 ile Delphi 2009 veya daha yeni sürümleri arasındaki çok belirgin belli başlı birkaç fark vardır. Son sürüm Delphi programlama dili C ve benzeri dillerde yıllardır bulunan değer geri çevirerek fonksiyondan çıkma desteği getirmiştir.

Kod: Tümünü seç

Exit(Val1)
Bu destek Delphi7'de yok. İlk düzeltmeniz gereken bu olacak. Bununla birlikte son sürüm Delphi ile gelen en belirgin özelliklerden diğeri "string helper functions". Bu .NET programlama dillerindeki gibi

Kod: Tümünü seç

Years.ToString()
kullanımını mümkün kıldı. Yukarıdaki satır Integer türündeki Years değişkenini string türüne çevirerek değeri geri çeviriyor. Delphi7'deki karşılığı

Kod: Tümünü seç

IntToStr(Years)
şeklinde oluyor.

Sorunuzu sorar iken kullandığınız Delphi sürümünü belirtmediğiniz için en son sürümler ile çalışacak kod örneği hazırladım. Bundan sonrası için sürüm belirtmeye özen göstermenizde fayda var.

Eğer unuttuğum birşey yok ise aşağıdaki kodun Delphi7 ile sorunsuz derlenmesi gerekli

Kod: Tümünü seç

uses
  DateUtils;

function GetDateDifferenceInNumbers(const Date1, Date2: TDateTime): string;

  function GetMin(const Val1, Val2: Double): Double;
  begin
    if Val1 < Val2 then Result := Val1 else Result := Val2;
  end;

  function GetMax(const Val1, Val2: Double): Double;
  begin
    if Val1 > Val2 then Result := Val1 else Result := Val2;
  end;

var
  MinDate: TDateTime;
  MaxDate: TDateTime;
  Years: Integer;
  Months: Integer;
  Days: Integer;
  Hours: Integer;
  Minutes: Integer;
  Seconds: Integer;
begin
  if Date1 = Date2 then
  begin
    Result := '0';
    Exit;
  end;

  MinDate := GetMin(Date1, Date2);
  MaxDate := GetMax(Date1, Date2);

  Years := YearsBetween(MinDate, MaxDate);
  if Years > 0 then MinDate := IncYear(MinDate, Years);

  Months := MonthsBetween(MaxDate, MinDate);
  if Months > 0 then MinDate := IncMonth(MinDate, Months);

  Days := DaysBetween(MaxDate, MinDate);
  if Days > 0 then MinDate := IncDay(MinDate, Days);

  Hours := HoursBetween(MinDate, MaxDate);
  if Hours > 0 then MinDate := IncHour(MinDate, Hours);

  Minutes := MinutesBetween(MaxDate, MinDate);
  if Minutes > 0 then MinDate := IncMinute(MinDate, Minutes);

  Seconds := SecondsBetween(MaxDate, MinDate);


  Result := EmptyStr;
  if Years > 0 then Result := IntToStr(Years) + ' YIL';
  if Months > 0 then Result := Result + ' ' + IntToStr(Months) + ' AY';
  if Days > 0 then Result := Result + ' ' + IntToStr(Days) + ' GÜN';
  if Hours > 0 then Result := Result + ' ' + IntToStr(Hours) + ' SAAT';
  if Minutes > 0 then Result := Result + ' ' + IntToStr(Minutes) + ' DAKİKA';
  if Seconds > 0 then Result := Result + ' ' + IntToStr(Seconds) + ' SANİYE';
end;

erdogan_ozkaya
Üye
Mesajlar: 798
Kayıt: 03 Eki 2007 01:00

Re: iki tarih ve saat arasındaki ay gün ve saat farkı

Mesaj gönderen erdogan_ozkaya » 31 Ara 2017 02:38

Hocam Çok teşekkür ederim, bunu mesaj değil qry calc olayına nasıl eklerim ?

QRY1.FieldByName('KALAN_ZAMAN').Text:= GetDateDifferenceInNumbers(
EncodeDateTime(QRY1.FieldByName('TARIH1').Value),
EncodeDateTime(QRY1.FieldByName('TARIH2').Value));

ertank
Üye
Mesajlar: 1111
Kayıt: 11 Eyl 2015 11:45

Re: iki tarih ve saat arasındaki ay gün ve saat farkı

Mesaj gönderen ertank » 31 Ara 2017 04:46

erdogan_ozkaya yazdı:
31 Ara 2017 02:38
Hocam Çok teşekkür ederim, bunu mesaj değil qry calc olayına nasıl eklerim ?

QRY1.FieldByName('KALAN_ZAMAN').Text:= GetDateDifferenceInNumbers(
EncodeDateTime(QRY1.FieldByName('TARIH1').Value),
EncodeDateTime(QRY1.FieldByName('TARIH2').Value));
Daha önce birçok kez Database içindeki alanlara "Variant" değil kolon veri türü ile erişim sağlanması gerektiğine dair forumda uyarılarda bulunmuştum. Sizin sorununuz tam olarak Variant kullanarak database tablo verilerine ulaşmanızdan kaynaklı.

Eğer kolon değerine NULL atama yapmayacak iseniz hiçbir zaman aşağıdaki

Kod: Tümünü seç

QRY1.FieldByName('TARIH1').Value
şekilde kullanmayın. Bunun yerine kolon veri türü ne ise uygun .AsString .AsInteger .AsFloat, .AsDate, .AsTime, .AsDateTime vb şekilde kullanın.

Sorunuzun cevabı aşağıdaki gibidir

Kod: Tümünü seç

      QRY1.FieldByName('KALAN_ZAMAN').AsString := GetDateDifferenceInNumbers(QRY1.FieldByName('TARIH1').AsDateTime, QRY1.FieldByName('TARIH2').AsDateTime);

erdogan_ozkaya
Üye
Mesajlar: 798
Kayıt: 03 Eki 2007 01:00

Re: iki tarih ve saat arasındaki ay gün ve saat farkı

Mesaj gönderen erdogan_ozkaya » 01 Oca 2018 07:04

Hocam Çok teşekkür ederim oldu.

Cevapla