// Paivamaara.cs Copyright (c) 2005 Kari Laitinen // http://www.naturalprogramming.com // 2005-01-22 Tiedosto luotu. // 2005-02-10 Viimeisin muutos. using System ; class Paivamaara { protected int tama_paiva = 1 ; protected int tama_kuukausi = 1 ; protected int tama_vuosi = 1970 ; protected char paivamaaran_formaatti = 'E' ; public Paivamaara() {} public Paivamaara( int annettu_paiva, int annettu_kuukausi, int annettu_vuosi, char annettu_formaatti ) { tama_paiva = annettu_paiva ; tama_kuukausi = annettu_kuukausi ; tama_vuosi = annettu_vuosi ; paivamaaran_formaatti = annettu_formaatti ; } public Paivamaara( int annettu_paiva, int annettu_kuukausi, int annettu_vuosi ) { tama_paiva = annettu_paiva ; tama_kuukausi = annettu_kuukausi ; tama_vuosi = annettu_vuosi ; } public Paivamaara( string paivamaara_stringina ) { // Tama konstruktori hyvaksyy paivamaaran kahdessa formaatissa: // // KK/PP/VVVV amerikkalainen formaatti // PP/KK/VVVV eurooppalainen formaatti // // Datakentta paivamaaran_formaatti asetetaan joko arvoon 'A' // tai arvoon 'E'. Tata formaattiarvoa kaytetaan ToString()- // metodissa kun paatetaan mihinka formaattiin paivamaara // asetetaan kun se muutetaan stringiksi. if ( paivamaara_stringina[ 2 ] == '/' ) { paivamaaran_formaatti = 'A' ; // amerikkalainen formaatti tama_paiva = Convert.ToInt32( paivamaara_stringina.Substring( 3, 2 ) ) ; tama_kuukausi = Convert.ToInt32( paivamaara_stringina.Substring( 0, 2 ) ) ; } else { paivamaaran_formaatti = 'E' ; // eurooppalainen formaatti tama_paiva = Convert.ToInt32( paivamaara_stringina.Substring( 0, 2 ) ) ; tama_kuukausi = Convert.ToInt32( paivamaara_stringina.Substring( 3, 2 ) ) ; } tama_vuosi = Convert.ToInt32( paivamaara_stringina.Substring( 6, 4 ) ) ; } public int paiva() { return tama_paiva ; } public int kuukausi() { return tama_kuukausi ; } public int vuosi() { return tama_vuosi ; } public char lue_paivamaaran_formaatti() { return paivamaaran_formaatti ; } public bool on_kuukauden_viimeinen_paiva() { bool nyt_on_kuukauden_viimeinen_paiva = false ; if ( tama_paiva > 27 ) { if ( tama_paiva == 31 ) { nyt_on_kuukauden_viimeinen_paiva = true ; } else if ( ( tama_paiva == 30 ) && ( tama_kuukausi == 2 || tama_kuukausi == 4 || tama_kuukausi == 6 || tama_kuukausi == 9 || tama_kuukausi == 11 ) ) { nyt_on_kuukauden_viimeinen_paiva = true ; } else if ( tama_paiva == 29 && tama_kuukausi == 2 ) { nyt_on_kuukauden_viimeinen_paiva = true ; } else if ( tama_paiva == 28 && tama_kuukausi == 2 && ! tama_on_karkausvuosi() ) { nyt_on_kuukauden_viimeinen_paiva = true ; } } return nyt_on_kuukauden_viimeinen_paiva ; } public bool tama_on_karkausvuosi() { bool palautuskoodi = false ; if ( tama_vuosi % 4 == 0 ) { // Vuodet jotka ovat tasan jaollisia neljalla ja jotka // eivat ole taysia vuosisatoja ovat karkausvuosia. // Neljalla tasan jaolliset vuosisadat eivat kuitenkaan // ole karkausvuosia. if ( tama_vuosi % 100 == 0 ) { int vuosisata = tama_vuosi / 100 ; if ( vuosisata % 4 == 0 ) { palautuskoodi = true ; } } else { palautuskoodi = true ; } } return palautuskoodi ; } public bool on_paivamaarien_sisalla( Paivamaara aikaisempi_paivamaara, Paivamaara myohaisempi_paivamaara ) { return (( on_sama_kuin( aikaisempi_paivamaara ) ) || ( on_sama_kuin( myohaisempi_paivamaara ) ) || ( on_myohaisempi_kuin( aikaisempi_paivamaara ) && on_aikaisempi_kuin( myohaisempi_paivamaara ) ) ) ; } public int viikonpaivan_indeksi() { // paivan_indeksi saa arvon alueelta 0 ... 6 // 0 tarkoittaa maanantaita ja 6 sunnuntaita. int paivan_indeksi = 0 ; Paivamaara tunnettu_paivamaara = new Paivamaara( 6, 10, 1997 ) ; // Lokakuun 6. paiva vuonna 1997 on maanantai. if ( tunnettu_paivamaara.on_myohaisempi_kuin( this ) ) { while ( tunnettu_paivamaara.on_eri_kuin( this ) ) { if ( paivan_indeksi > 0 ) { paivan_indeksi -- ; } else { paivan_indeksi = 6 ; } tunnettu_paivamaara.pienenna() ; } } else { while ( tunnettu_paivamaara.on_eri_kuin( this ) ) { if ( paivan_indeksi < 6 ) { paivan_indeksi ++ ; } else { paivan_indeksi = 0 ; } tunnettu_paivamaara.kasvata() ; } } return paivan_indeksi ; } public string anna_viikonpaiva() { String[] viikonpaivat = { "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai" } ; return viikonpaivat[ viikonpaivan_indeksi() ] ; } public void kasvata() { if ( on_kuukauden_viimeinen_paiva() ) { tama_paiva = 1 ; if ( tama_kuukausi < 12 ) { tama_kuukausi ++ ; } else { tama_kuukausi = 1 ; tama_vuosi ++ ; } } else { tama_paiva ++ ; } } public void pienenna() { if ( tama_paiva > 1 ) { tama_paiva -- ; } else { if ( tama_kuukausi == 5 || tama_kuukausi == 7 || tama_kuukausi == 10 || tama_kuukausi == 12 ) { tama_paiva = 30 ; tama_kuukausi -- ; } else if ( tama_kuukausi == 2 || tama_kuukausi == 4 || tama_kuukausi == 6 || tama_kuukausi == 8 || tama_kuukausi == 9 || tama_kuukausi == 11 ) { tama_paiva = 31 ; tama_kuukausi -- ; } else if ( tama_kuukausi == 1 ) { tama_paiva = 31 ; tama_kuukausi = 12 ; tama_vuosi -- ; } else if ( tama_kuukausi == 3 ) { tama_kuukausi = 2 ; if ( tama_on_karkausvuosi() ) { tama_paiva = 29 ; } else { tama_paiva = 28 ; } } } } // Seuraava metodi toimii kuten englanninkielisen Date-luokan // vastaava metodi, mutta sen sisainen toteutus on hiukan // erilainen koska metodi piti saada mahtumaan yhdelle sivulle // suomenkielisilla pidemmilla nimilla varustettuna. public void laske_etaisyys( Paivamaara toinen_paivamaara, out int etaisyyden_vuodet, out int etaisyyden_kuukaudet, out int etaisyyden_paivat ) { Paivamaara alkupaivamaara ; Paivamaara loppupaivamaara ; if ( this.on_aikaisempi_kuin( toinen_paivamaara ) ) { alkupaivamaara = this ; loppupaivamaara = toinen_paivamaara ; } else { alkupaivamaara = toinen_paivamaara ; loppupaivamaara = this ; } int alkupaiva = alkupaivamaara.paiva() ; // Oletetaan etta paiva 30 on jokaisen kuukauden viimeinen // paiva. Nain pienennetaan virhetodennakoisyytta. if ( alkupaivamaara.on_kuukauden_viimeinen_paiva() || ( alkupaivamaara.paiva() == 28 && alkupaivamaara.kuukausi() == 2 ) ) { alkupaiva = 30 ; } int loppupaiva = loppupaivamaara.paiva() ; if ( loppupaivamaara.on_kuukauden_viimeinen_paiva() || ( loppupaivamaara.paiva() == 28 && loppupaivamaara.kuukausi() == 2 ) ) { loppupaiva = 30 ; } etaisyyden_vuodet = loppupaivamaara.vuosi() - alkupaivamaara.vuosi() ; etaisyyden_kuukaudet = loppupaivamaara.kuukausi() - alkupaivamaara.kuukausi() ; etaisyyden_paivat = loppupaiva - alkupaiva ; if ( etaisyyden_paivat < 0 ) { etaisyyden_kuukaudet -- ; etaisyyden_paivat = etaisyyden_paivat + 30 ; } if ( etaisyyden_kuukaudet < 0 ) { etaisyyden_vuodet -- ; etaisyyden_kuukaudet = etaisyyden_kuukaudet + 12 ; } } public int laske_viikkonumero() { // 1. tammikuuta 1883 oli maanantai viikkonumerolla 1. // 1. tammikuuta 1990 oli maanantai viikkonumerolla 1. Paivamaara kasvatettava_paivamaara = new Paivamaara( 1, 1, 1883 ) ; int viikon_numero = 1 ; int viikonpaivan_indeksi = 0 ; // 0 tarkoittaaa maanantaita while ( kasvatettava_paivamaara.on_aikaisempi_kuin( this ) ) { kasvatettava_paivamaara.kasvata() ; if ( viikonpaivan_indeksi == 6 ) // 6 tarkoittaa sunnuntaita { viikonpaivan_indeksi = 0 ; // takaisin maanantaihin if ( viikon_numero < 52 ) { viikon_numero ++ ; } else if ( viikon_numero == 52 ) { if ( kasvatettava_paivamaara.paiva() <= 28 && kasvatettava_paivamaara.kuukausi() == 12 ) { viikon_numero = 53 ; } else { viikon_numero = 1 ; } } else // must be viikon_numero 53 { viikon_numero = 1 ; } } else { viikonpaivan_indeksi ++ ; } } return viikon_numero ; } public bool on_sama_kuin( Paivamaara toinen_paivamaara ) { return ( tama_paiva == toinen_paivamaara.paiva() && tama_kuukausi == toinen_paivamaara.kuukausi() && tama_vuosi == toinen_paivamaara.vuosi() ) ; } public bool on_eri_kuin( Paivamaara toinen_paivamaara ) { return ( tama_paiva != toinen_paivamaara.paiva() || tama_kuukausi != toinen_paivamaara.kuukausi() || tama_vuosi != toinen_paivamaara.vuosi() ) ; } public bool on_aikaisempi_kuin( Paivamaara toinen_paivamaara ) { return ( ( tama_vuosi < toinen_paivamaara.vuosi() ) || ( ( tama_vuosi == toinen_paivamaara.vuosi() ) && ( tama_kuukausi < toinen_paivamaara.kuukausi() ) ) || ( ( tama_vuosi == toinen_paivamaara.vuosi() ) && ( tama_kuukausi == toinen_paivamaara.kuukausi() ) && ( tama_paiva < toinen_paivamaara.paiva() ) ) ) ; } public bool on_myohaisempi_kuin( Paivamaara toinen_paivamaara ) { return ( ( tama_vuosi > toinen_paivamaara.vuosi() ) || ( ( tama_vuosi == toinen_paivamaara.vuosi() ) && ( tama_kuukausi > toinen_paivamaara.kuukausi() ) ) || ( ( tama_vuosi == toinen_paivamaara.vuosi() ) && ( tama_kuukausi == toinen_paivamaara.kuukausi() ) && ( tama_paiva > toinen_paivamaara.paiva() ) ) ) ; } public override string ToString() { String paiva_stringina = tama_paiva.ToString( "D2" ) ; String kuukausi_stringina = tama_kuukausi.ToString( "D2" ) ; String vuosi_stringina = tama_vuosi.ToString() ; string palautettava_stringi ; if ( paivamaaran_formaatti == 'A' ) { palautettava_stringi = kuukausi_stringina + "/" + paiva_stringina + "/" + vuosi_stringina ; } else { palautettava_stringi = paiva_stringina + "." + kuukausi_stringina + "." + vuosi_stringina ; } return palautettava_stringi ; } }