iki saat arasındaki farkı nasıl alırız

C, C++ ve C++ Builder ile ilgili konuları buraya yazabilirsiniz.
Cevapla
Kullanıcı avatarı
dynamo
Üye
Mesajlar: 96
Kayıt: 21 Haz 2005 02:05
Konum: istanbul

iki saat arasındaki farkı nasıl alırız

Mesaj gönderen dynamo »

c++ builder da iki saat arasındaki farkı almak istiyorum.örnek,saat1 "14:25:00" , saat2 "14:35:00" ise aradaki fark "10 dk", yada saat1 "14:25:00" , saat2 "17:35:00" ise aradaki fark "3 sa 10 dk" gibi sonucu elde edip Edit'e atmak istiyorum.saat bilgilerini tablo'dan alıyorum.


Kod: Tümünü seç

sprintf(c_saat_1,"%s",Query1->FieldByName("saat_1")->AsString.c_str());
sprintf(c_saat_2,"%s",Query1->FieldByName("saat_2")->AsString.c_str());

faserka
Üye
Mesajlar: 14
Kayıt: 13 Ağu 2004 04:00

Mesaj gönderen faserka »

Edit1->Text = TimeToStr(DateTimePicker1->Time - DateTimePicker2->Time);
Kullanıcı avatarı
dynamo
Üye
Mesajlar: 96
Kayıt: 21 Haz 2005 02:05
Konum: istanbul

Mesaj gönderen dynamo »

DateTimePicker dan aynı günde iki saat arasındak farkı Edit1->Text = TimeToStr(DateTimePicker1->Time - DateTimePicker2->Time); alabiliriz. yaptığım işlem tablodaki tarih ve saat alanlarını alarak kontrol etmek.

viewtopic.php?t=13684&highlight=interne ... ant%FDs%FD

linkteki delphi kodunu kullandım:

Kod: Tümünü seç

var
yil1,ay1,gun1,saat1,dk1,saniye1,ms1:Word;
yil2,ay2,gun2,saat2,dk2,saniye2,ms2:Word;
SaatFarki,DakikaFarki,SaniyeFarki:String;

zaman_1,zaman_2:string;
saat_1,saat_2:integer;
fark :integer;
begin
    zaman_1:='23.11.2006 11:10:15';
    DecodeDateTime(strtodatetime(zaman_1),yil1,ay1,gun1,saat1,dk1,saniye1,ms1);
    saat_1:=saat1*3600000+dk1*60000+saniye1*1000+ms1;

    zaman_2:='24.11.2006 17:20:15';
    DecodeDateTime(strtodatetime(zaman_2),yil2,ay2,gun2,saat2,dk2,saniye2,ms2);
    saat_2:=saat2*3600000+dk2*60000+saniye2*1000+ms2;


    if saat_1<saat_2 Then
    begin
        fark:=saat_2-saat_1;
        SaatFarki:=IntToStr(fark div 3600000);

        fark:=fark mod 3600000;

        DakikaFarki:=IntToStr(fark div 60000);
        fark:=fark mod 60000;

        SaniyeFarki:=IntToStr(fark div 1000);

        label1.caption :=SaatFarki+'  '+ DakikaFarki;
    end;

end;
fakat bu kod aynı gün için zaman farkını veriyor.zaman_1 ile zaman_2 arasındaki farkı 6 sa 10 dk olarak veriyor. geçen 1 gün (24 saat ) hesaplamıyor yani 30 sa 10 dk olarak vermesi için ne yapmalı.
aynı kodun c++ hali :

Kod: Tümünü seç

char    c_tarih_1[16];
char    c_saat_1[16];
char    c_tarih_2[16];
char    c_saat_2[16];
char    c_zaman_1[32];
char    c_zaman_2[32];
char    c_toplam_sure[16];
Word    yil1,ay1,gun1,saat1,dk1,saniye1,ms1;
Word    yil2,ay2,gun2,saat2,dk2,saniye2,ms2;
AnsiString    saat_farki,dk_farki,saniye_farki;
AnsiString    saat_1,saat_2,str;
int     fark;
      


       memset(c_tarih_1      ,'\0',sizeof(c_tarih_1       ));
        memset(c_saat_1      ,'\0',sizeof(c_saat_1       ));
        memset(c_zaman_1      ,'\0',sizeof(c_zaman_1      ));
        sprintf(c_tarih_1,"%s",Query1->FieldByName("tarih_1")->AsString.c_str());
        sprintf(c_saat_1,"%s",Query1->FieldByName("saat_1")->AsString.c_str());
        sprintf(c_zaman_1,"%s %s",c_tarih_1,c_saat_1);
        DecodeDateTime(StrToDateTime(c_zaman_1),yil1,ay1,gun1,saat1,dk1,saniye1,ms1);
        saat_1=saat1*3600000+dk1*60000+saniye1*1000+ms1;

        memset(c_tarih_2      ,'\0',sizeof(c_tarih_2       ));
        memset(c_saat_2      ,'\0',sizeof(c_saat_2       ));
        memset(c_zaman_2      ,'\0',sizeof(c_zaman_2      ));
        sprintf(c_tarih_2,"%s",Query1->FieldByName("tarih_2")->AsString.c_str());
        sprintf(c_saat_2,"%s",Query1->FieldByName("saat_2")->AsString.c_str());
        sprintf(c_zaman_2,"%s %s",c_tarih_2,c_saat_2);
        DecodeDateTime(StrToDateTime(c_zaman_2),yil2,ay2,gun2,saat2,dk2,saniye2,ms2);
        saat_2=saat2*3600000+dk2*60000+saniye2*1000+ms2;

        if (saat_1 < saat_2 )  {
            fark=saat_2-saat_1;
            saat_farki=IntToStr(fark / 3600000);
            fark=fmod(fark,3600000);

            dk_farki=IntToStr(fark / 60000);
            fark=fmod(fark,60000);

            saniye_farki=IntToStr(fark / 1000);

            str=saat_farki+"  sa  "+ dk_farki+"  dk";
        }

        sprintf(c_toplam_sure,"%s",str.c_str());

Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

:cry: | :) :?:
Kullanıcı avatarı
dynamo
Üye
Mesajlar: 96
Kayıt: 21 Haz 2005 02:05
Konum: istanbul

Mesaj gönderen dynamo »

yapamak istediğim şu , örnek: zaman_1:='23.11.2006 11:10:15'; zaman_2:='24.11.2006 12:20:15'; bu ikisi arasında geçen zamanı " 25 sa 10 dk " olarak elde etmek istiyorum. ?
hem delphi hem c++ ta yukardaki kodları sadece aynı gün içindeki farkı veriyor. gün gemiş ise (24,48,...) dikakete almıyor. :!: :?: :?:
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Tarih ve saat için String veri tipini kullanmak bence doğru değil.

Tarih ve saat bilgileri genelde Julian Date (Yanlış yazmış olabilirim) sisteminde tutulurlar. Yani tarih ve saat dediğiniz aslında double bir sayıdır. Bu double sayının tamsayı kısmı tarihi, ondalık kısmı ise saati gösterir. Her 24 saat 1 değerine denk gelir ve bu sayede tarihin gün değeri bir artarken, saat de sıfırlanmış olur.

Bu kısa giriş bilgisinden sonra yapmak istediğiniz işlem biraz daha aydınlanıyor. Eğer çıkarma işlemini sadece saatleri kullanarak yaparsanız elbette 30 saat yerine 6 saat alacaksınız, çünkü işleme tamsayı kısmını dahil etmemiş oluyorsunuz. Yani gün bilgisi yok. Sizin yaptığınız 0.1431231 - 0.1312314 gibi iki sayıyı birbirinden çıkarmak. Ve bu çıkarma işlemi asla 1'in üstünde olamayacağı için gün değerini (ya da 30 saat gibi bir değeri) asla elde edemeyeceksiniz.

Sonuç olarak sizin veri tabanına saati kaydederken günü de kaydetmeniz gerekiyor. Aksi takdirde asla gerçekten güvenilir bir saat farkı alamazsınız.

Kolay gelsin,
Bahadır Alkaç
Kullanıcı avatarı
KoPilot
Üye
Mesajlar: 185
Kayıt: 05 Eki 2007 08:02

Re: iki saat arasındaki farkı nasıl alırız

Mesaj gönderen KoPilot »

Afedersiniz yanlış yermiş...

http://delphiturkiye.com/forum/viewtopi ... =2&t=28385

Taşıdım.
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk
Eyvallah..
Cevapla