Yıl Ay Gün olarak verilen tarihin yarısını bulmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Yıl Ay Gün olarak verilen tarihin yarısını bulmak

Mesaj gönderen vedatkaba »

Arkadaşlar herkese kolay gelsin diyorum...

İŞten güçten eski günler kadar aktif olamıyordum forumu takip ediyordum ama aktif olamıyordum..

Benim sorum şu olacak arkadaşlar..

5 yıl 16 ay 7 gün olarak verilen zamanın yarısını almak...

Cebirsel olarak yapacağımız işlemde bunu aşağıdaki şekilde yapıyoruz...

5 yıl 16 ay 7 gün
------------------------
2 yıl 6 ay 2,5 gün :ilk önce 5 yılın yarısını alıyoruz (yani 2,5 yıl) ;daha sonra ,
8 ay 3,5 gün : geriye kalan ay ve günün yarısını alıyoruz...
----------------------------------- topluyoruz..
2 yıl 14 ay 7 gün olarak karşımıza çıkıyo(bu 5 yıl 16 ay 7 günün yarısı)

bu işlemi delphide bir iki yol denedim ama yapamadım çünkü ileriki tarihi hatalı buldu...

not :Sonuc elimizdeki bir tarihe eklenerek ileriki bir tarihi gidilecek

Yardımlarınızı bekliyorum..
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
mehmetcan
Üye
Mesajlar: 63
Kayıt: 14 Tem 2008 05:19

Re: Yıl Ay Gün olarak verilen tarihin yarısını bulmak

Mesaj gönderen mehmetcan »

Kod: Tümünü seç

var
tarih1, eklenecek_tarih : TDateTime;
......

  tarih1:= EncodeDate(5,16,7);
  tarih1:= tarih1 / 2;
  
  ShowMessage( ' Esas Tarih: '+FormatDateTime('dd/mm/yyyy', eklenecek_tarih+ tarih1); 



Eklenecek_tarih in hazır geldigini varsaydım.

Bölme işlemi oldugu için güvenlik istersen tarih1 in sıfır olup, olmadıgını kontrol et veya try .. finally blogu kullan.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Yıl Ay Gün olarak verilen tarihin yarısını bulmak

Mesaj gönderen ikutluay »

vedatkaba yazdı:Arkadaşlar herkese kolay gelsin diyorum...

İŞten güçten eski günler kadar aktif olamıyordum forumu takip ediyordum ama aktif olamıyordum..

Benim sorum şu olacak arkadaşlar..

5 yıl 16 ay 7 gün olarak verilen zamanın yarısını almak...

Cebirsel olarak yapacağımız işlemde bunu aşağıdaki şekilde yapıyoruz...

5 yıl 16 ay 7 gün
------------------------
2 yıl 6 ay 2,5 gün :ilk önce 5 yılın yarısını alıyoruz (yani 2,5 yıl) ;daha sonra ,
8 ay 3,5 gün : geriye kalan ay ve günün yarısını alıyoruz...
----------------------------------- topluyoruz..
2 yıl 14 ay 7 gün olarak karşımıza çıkıyo(bu 5 yıl 16 ay 7 günün yarısı)

bu işlemi delphide bir iki yol denedim ama yapamadım çünkü ileriki tarihi hatalı buldu...

not :Sonuc elimizdeki bir tarihe eklenerek ileriki bir tarihi gidilecek

Yardımlarınızı bekliyorum..
yılı 36o ve ayları 30 alırsanız kolay. ama bu şekilde net bir formül bulamazsınız ...

dediğim varsayımla olursa iş kolay

yıl * 360 + ay * 30 + gun

sonrasında iki ye bölüp geri kalanda önce 360 bölüm ve diğerleri şeklinde iş biter


ama böyle net bir hesap çok zor. hangi ay 31 çekecek şubat 29 durumu nedir. bu hesabın içinden çıkılmaz bence
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
mehmetcan
Üye
Mesajlar: 63
Kayıt: 14 Tem 2008 05:19

Re: Yıl Ay Gün olarak verilen tarihin yarısını bulmak

Mesaj gönderen mehmetcan »

Benim verdigim hesapta delphi işleri karıştırıyor.

Ek: Yıldan 950 cıkarınca sorun çözülüyor. 950 + 950 1900 yani.
Delphi verilen yıllara 1900 u ekliyor. Sanırım bunun engellenebilecegi yer vardır.
Aşagıdaki kod işini görür. Tabii bunlar yuvarlak rakamlar.

Kod: Tümünü seç

var
  tarih1 : TDateTime;
  yil, ay,gun : word;
...........
  tarih1:=EncodeDate(StrToInt(Edit1.text),StrToInt(edit2.Text),StrToInt(Edit3.Text));
  DecodeDate(tarih1/2, yil,ay,gun);
  yil:=yil-950;
  ShowMessage(Format('Yıl %d Ay %d Gun %d ',[yil,ay,gun]));
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Re: Yıl Ay Gün olarak verilen tarihin yarısını bulmak

Mesaj gönderen vedatkaba »

Verdiğiniz cevapları deniycem ;

Şunu yazmadan geçmeyeyim , mesela 5 yılı 365 ile çarparsak1825 gün çıkıyor ve bunun yarısı 912,5 tir bunun üzerine 16 ayında yarısı 8 eder 7 günün yarısıda 3,5 gün olarak hesaplarsak ,,

912,5 / 365 dersek kaç yıl olduğunu bulmak istersek sonuç 2,5 küsüratlı çıkıyor aslında benim istediğimde 2 yıl 6 ay 2,5 gün olması =2,5 yıl,,,

yıl olarak 2 ,ay olarak 8+6 ve gün olarak ise 2,5 + 3,5 asıl sayımızdaki

2,5 gün 912,5 günün yıla göre hesabından kalan
3,5 gün ise asıl gün sayım olan 7 günün yarısı,,

hepsini gün olarak hesaplayarak eldeki tarihe incday olarak saydırabilirsiniz ve o tarihe gidebilir ama ;
bir diğer türlü olan ilk önce yılı ekletmek daha sonra ay sayısını güne çevirip toplam günü yılı eklenen tarihe incday fonksiyonuyla eklendiği zaman yine aynı tarihe gitmesi olacak anlatabildim galiba.
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: Yıl Ay Gün olarak verilen tarihin yarısını bulmak

Mesaj gönderen Hakan Can »

SysUtils ve DateUtils unitlerinde IncYear, IncMonth ve IncDay fonksiyonları mevcut. Bunları kullanarak istediğini yapabilirsin.

Şu fonksiyondan istifade edebilirsin:

Kod: Tümünü seç

function TarihinYarisi(const aStartDate: TDateTime; const aYear, aMonth, aDay: Word): Double;
begin
  Result := (IncDay(IncMonth(IncYear(aStartDate, aYear), aMonth), aDay) - aStartDate) / 2;
end;
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Re: Yıl Ay Gün olarak verilen tarihin yarısını bulmak

Mesaj gönderen vedatkaba »

Hakan Can yazdı:SysUtils ve DateUtils unitlerinde IncYear, IncMonth ve IncDay fonksiyonları mevcut. Bunları kullanarak istediğini yapabilirsin.

Şu fonksiyondan istifade edebilirsin:

Kod: Tümünü seç

function TarihinYarisi(const aStartDate: TDateTime; const aYear, aMonth, aDay: Word): Double;
begin
  Result := (IncDay(IncMonth(IncYear(aStartDate, aYear), aMonth), aDay) - aStartDate) / 2;
end;

Hocam verdiğin kodu uyguladım ama çeşitli tarihlerde farklı bir sonuç çıkartıyor,,mesela 14.08.2008 tarihinden 1160 gün diyor 5 yıl 16 ay 7 günün yarısı 1160 çıkartıyor biraz daha eski bir tarih yazıyorum bu kez 1160,5 diye çıkıyor ,
Ben kendim elle 5 yıl 16 ay 7 günün yarısını alıyorum 1156 gün hesaplanıyor ve gittiği tarih farklı olur garip olan nedir anlamadım kafamda iyicve karıştı..
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
mehmetcan
Üye
Mesajlar: 63
Kayıt: 14 Tem 2008 05:19

Re: Yıl Ay Gün olarak verilen tarihin yarısını bulmak

Mesaj gönderen mehmetcan »

1 yıl 12 aydır, 1 ay 30 gündür. Eger bu sabitlere baglı kalmazsan, tam anlamıyla çeviri yapamazsın.
Öncelikle 5 yıl 16 ay 7 günü normalleştirmen lazım. Yani 6 yıl 4 ay 7 gün olaraka yazmalısın. Daha sonra bunun yarısını alabilirsin. Yani 3 yıl 2 ay 3.5gün gibi.

Bu arada bu degerleri göreceli olarak aldıgından ( ayı 30 gün ve yılı 365 gün) uzun vadeli hesaplamaların hep hatalı olacaktır. Ya tüm hesaplarını güne cevirip, o şekilde kullanacaksın veya bu hatalara katlanacaksın. Çünkü her ay 30 gün degildir, her yıl 365 gün degildir.

Bu hesaplara tam olarak nerede ihtiyaç duyuyorsun ve o sektörde bu hesaplamalar nasıl yapılıyor, bunu araştırman daha dogru olur.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Re: Yıl Ay Gün olarak verilen tarihin yarısını bulmak

Mesaj gönderen ofenX »

vedatkaba yazdı: Hocam verdiğin kodu uyguladım ama çeşitli tarihlerde farklı bir sonuç çıkartıyor,,mesela 14.08.2008 tarihinden 1160 gün diyor 5 yıl 16 ay 7 günün yarısı 1160 çıkartıyor biraz daha eski bir tarih yazıyorum bu kez 1160,5 diye çıkıyor ,
Ben kendim elle 5 yıl 16 ay 7 günün yarısını alıyorum 1156 gün hesaplanıyor ve gittiği tarih farklı olur garip olan nedir anlamadım kafamda iyicve karıştı..
Merhaba,
Size verilen yılı ayı ikiye bölmekten ziyade belli(gerçek) bir tarih ve eklenecek yıl ay bilgisi lazım olacaktır. Siz verilen yıl ve ayı gerçek bir takvime göre eklemelisiniz. Böyle olunca Hakan Can arkadaşımızın verdiği örnek ile sonuca ulaşabilirsiniz.
Çünkü 2008 yılına göre incyear() 366 gün iken 2007 yılı için 365 gün olacaktır. Benzer şekilde
14.02.2008 için incmonth 29 iken 14.02.2007 için 28 olacaktır.
14.08.2008 için inchmont 31 iken 14.09.2008 için 30 olacaktır. Böyle olunca siz yılı direk 5*365 ,ayı 14*30 yapamazsınız. Bulunduğu tarihe göre toplam aldırmanız lazım. Hakan Can ın verdiği örneğe göre iki tarih arasındaki farkı rakam bazında alıp 2 ye böldükten sonra yine tarihe çevireceksiniz.
Kafanızın karışması artık yılları ve her ayı 30 hesaplamanızdan kaynaklanıyor.

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Cevapla