1 Son düzenleyen, konuka (08.09.2007 17:33:21)

Konu: bir tarihin geçerli olduğunu nasıl test ederiz ?

Spinner kontrolü ile yıl - ay - gün giriyoruz.
Spinner Low veya high Value ile ayı 1-12 günü 1-31 arası set ettik.

örneğin 2007 02 30 (30 Şubat 2007) yi ERROR tuzağı dışında tespit etmek mümkün mü?

aşağıdaki kod işe yaramadı:
WITH ThisForm
DO WHIL ! TYPE("DATE(.spinnerSene.Value,.spinnerAy.Value,.spinnerGün.Value)")="D"
  .spinnerGün.Value=.spinnerGün.Value-1
ENDD
ENDW

VFP9 SP2

2 Son düzenleyen, taRKan (08.09.2007 18:15:41)

Re: bir tarihin geçerli olduğunu nasıl test ederiz ?

Aklıma gelen ilk çözüm;

Visual Fox Pro
With ThisForm

    Do While Empty(Date(.spinnerSene.Value, .spinnerAy.Value, .spinnerGün.Value))
          .spinnerGün.Value = .spinnerGün.Value - 1
    EndDo
EndWith
/o---------------------o\
     www.haser.com
\o---------------------o/

3

Re: bir tarihin geçerli olduğunu nasıl test ederiz ?

çok tşk.
EMPTY kullanmayı bilmiyordum.

VFP9 SP2

4

Re: bir tarihin geçerli olduğunu nasıl test ederiz ?

empty(ctod(textmerge("^<<.spnSene.Value>>/<<.spnAy.Value>>/<<.spnGun.Value>>")))

empty(date(y,a,g)) iyi ama bazi degerlerde hata verir.

5 Son düzenleyen, taRKan (09.09.2007 22:02:19)

Re: bir tarihin geçerli olduğunu nasıl test ederiz ?

Evet haklısın,
Date fonksiyonunda gün 32 olduğunda hata veriyor.
Valla harikasın. Aklımdan şu geçiyor bu detayları nasıl biliyorsun?
Bir yerlerde yazıyorsa biz de okuyalım big_smile

/o---------------------o\
     www.haser.com
\o---------------------o/

6 Son düzenleyen, foxman (10.09.2007 22:53:49)

Re: bir tarihin geçerli olduğunu nasıl test ederiz ?

Şubat haricindeki ayların gün sayıları değişmiyor, şubat hangi yılda 29 çekiyor bunu bulan formülü ilave edersek tarih kontrolunu yapabiliriz. Not:1900,2500 yıl aralığı standart değil sadece benim tercihim.

Visual Fox Pro
intYY=2005

intMM=2
intDD=29
 
If Between(intYY,1900,2500) ;
    And Between(intMM,1,12) ;
    And Between(intDD,1,Val(Substr("31"+Iif((intYY%4=0 And intYY%100<>0) Or intYY%400=0,"29","28")+"31303130313130313031",intMM*2-1,2)))
    ?"doğru tarih"
Else
    ?"yanlış tarih"
Endif

7

Re: bir tarihin geçerli olduğunu nasıl test ederiz ?

Konu açılalı çok olmuş ancak dikkatimi çektiği için not düşüp arayanlar için bilgi olarak gözükmesinde fayda var diye düşündüm.
Şubat ayları 4 yılda bir 29 çeker. Tarihin yıl bilgisi 4'e tam bölünebiliyorsa 29 bölünemiyorsa 28 çeker.

8

Re: bir tarihin geçerli olduğunu nasıl test ederiz ?

sasmazali yazdı:

Konu açılalı çok olmuş ancak dikkatimi çektiği için not düşüp arayanlar için bilgi olarak gözükmesinde fayda var diye düşündüm.
Şubat ayları 4 yılda bir 29 çeker. Tarihin yıl bilgisi 4'e tam bölünebiliyorsa 29 bölünemiyorsa 28 çeker.

Uzgunum ama yanlis bilgi. Bir yilda 29 cekmesi icin:

1) Yil 4'e tam bolunmeli
2) Ancak 100'e tam bolunmemeli YA DA 400'e tam bolunmeli. ( 1700 olmaz, 2000 olur )

Visual Fox Pro
*** Parametre: Sene (int),

***            tarih (date),tarihsaat (datetime)
***            tarih string (cast(x as datetime) tarih veriyorsa)
*** 29 subat kontrolu (leap = .t. -> subat 29)
Function isLeapYear( tuValue )
    tuValue = Icase( Vartype(m.tuValue) = 'N', m.tuValue,;
        Vartype(m.tuValue) $ 'DT', Year(m.tuValue), ;
        Vartype(m.tuValue) = 'C' And !Empty(Cast(m.tuValue As Datetime)), Year(Cast(m.tuValue As Datetime)),;
        null)
 
    Return !Isnull(m.tuValue) And ;
        m.tuValue % 4 = 0 And ;
        (m.tuValue % 100 != 0 Or m.tuValue % 400 = 0)
Endfunc

Parametere kontrolsuz sadece year ile basit hali:

Visual Fox Pro
Function isLeapYear( tuValue )

    Return m.tuValue % 4 = 0 And ;
        (m.tuValue % 100 != 0 Or m.tuValue % 400 = 0)
Endfunc

9

Re: bir tarihin geçerli olduğunu nasıl test ederiz ?

Harikasın Kod için teşekkürler

10 Son düzenleyen, sasmazali (08.08.2014 22:46:38)

Re: bir tarihin geçerli olduğunu nasıl test ederiz ?

Çetin hocam şuana kadar hiç hata ile karşılaşmadım (çok geniş tarih aralıkları ile işlem yapmadığımdan ve tarih kutucuğu kullandığımdan sanırım) ancak excelde ufak bir formül ile 1900-2100 arasında kontrol yaptım.
1900 ile 2100 arasında sizin koşullarda 49 tane 29 şubat çeken var, 4 bölünenler ise 51 adet ve 2 fazlalığın sebebi de 1900 ve 2100 yıllarının sizin koşullara uymaması. Fox üzerinden test ettiğimdede hakikaten bu yıllarda şubat 29 çekmiyor.

0 yılından 2100 yılına kadar excelde ve fox da döngü ile kontroller yaptığımda illaki sizin koşulların geçerli olması gerekiyor. Ben yeni öğrendim ve hakikaten çok önemli bir ayrıntı.

Aklıma şu takıldı. 1 yıl 365 gün 6 saat ve 4 yılda bir 6 saat eklenerek (24 saat) yıl 366 çekiyor gibi planlanıp şubat 29 olarak düzenleniyor. ancak 2096 yılından sonra 8.yılda (2104 yılı) 1 gün eklenmiş oluyor. Bu durumda aylar 1 gün geriye kaymış olmuyor mu?

Excel'de 0-2014 tarihi arasında 4 bölünen 504 tane ancak 29 çeken şubat ayı sayısı 489 tane buda 15 fark yapıyor ki 15 gün geriye gitmek demek. Yani bugün 24 Temmuz 2014 de denk geliyor.

İşin içinden çıkamadım. Öğrendim ama kafamda karışmadı değil sad . Sebebini biliyorsanız yazabilir misiniz?

Önemli ayrıntı için teşekkürler. Sürekli formu okuyarak yeni şeyler kazanıyorum.

11

Re: bir tarihin geçerli olduğunu nasıl test ederiz ?

Wikipedia'dan:

In the Gregorian calendar, the current standard calendar in most of the world, most years that are integer multiples of 4 are leap years. In each leap year, the month of February has 29 days instead of 28. Adding an extra day to the calendar every four years compensates for the fact that a period of 365 days is shorter than a solar year by almost 6 hours. This calendar was first used in 1582.

Some exceptions to this basic rule are required since the duration of a solar year is slightly less than 365.25 days. Over a period of 4 centuries, the accumulated error of adding a leap day every 4 years amounts to about 3 extra days. The Gregorian Calendar therefore omits 3 leap days every 400 years, which is the length of its leap cycle. This is done by omitting February 29 in the 3 century years (integer multiples of 100) that are not also integer multiples of 400.[3] For example, 1700, 1800, 1900, 2100 and 2200 are common years, but 1600, 2000 and 2400 are leap years. By this rule, the average number of days per year is 365 + 1/4 − 1/100 + 1/400 = 365.2425.[4] The rule can be applied to years before the Gregorian reform (the proleptic Gregorian calendar). The rule is not directly applicable to years numbered with BC notation. Since 0 is divisible by 4, 100, and 400, the "year 0" (1 BC) is a leap year. Thus the rule can be applied to years before AD 1 if astronomical year numbering is used.[5]