// Paivamaara.java Copyright (c) 2006 Kari Laitinen // http://www.naturalprogramming.com // 2006-03-03 Tiedosto luotu. // 2006-03-03 Viimeisin muutos. 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.charAt( 2 ) == '/' ) { paivamaaran_formaatti = 'A' ; // amerikkalainen formaatti tama_paiva = Integer.parseInt( paivamaara_stringina.substring( 3, 5 ) ) ; tama_kuukausi = Integer.parseInt( paivamaara_stringina.substring( 0, 2 ) ) ; } else { paivamaaran_formaatti = 'E' ; // eurooppalainen formaatti tama_paiva = Integer.parseInt( paivamaara_stringina.substring( 0, 2 ) ) ; tama_kuukausi = Integer.parseInt( paivamaara_stringina.substring( 3, 5 ) ) ; } tama_vuosi = Integer.parseInt( paivamaara_stringina.substring( 6, 10 ) ) ; } 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 boolean on_kuukauden_viimeinen_paiva() { boolean 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 boolean tama_on_karkausvuosi() { boolean 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 boolean 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 PaivienEtaisyys laske_etaisyys( Paivamaara toinen_paivamaara ) { PaivienEtaisyys palautettava_etaisyys = new PaivienEtaisyys() ; Paivamaara alkupaivamaara, 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 ; } palautettava_etaisyys.vuodet = loppupaivamaara.vuosi() - alkupaivamaara.vuosi() ; palautettava_etaisyys.kuukaudet = loppupaivamaara.kuukausi() - alkupaivamaara.kuukausi() ; palautettava_etaisyys.paivat = loppupaiva - alkupaiva ; if ( palautettava_etaisyys.paivat < 0 ) { palautettava_etaisyys.kuukaudet -- ; palautettava_etaisyys.paivat = palautettava_etaisyys.paivat + 30 ; } if ( palautettava_etaisyys.kuukaudet < 0 ) { palautettava_etaisyys.vuodet -- ; palautettava_etaisyys.kuukaudet = palautettava_etaisyys.kuukaudet + 12 ; } return palautettava_etaisyys ; } 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 boolean on_sama_kuin( Paivamaara toinen_paivamaara ) { return ( tama_paiva == toinen_paivamaara.paiva() && tama_kuukausi == toinen_paivamaara.kuukausi() && tama_vuosi == toinen_paivamaara.vuosi() ) ; } public boolean on_eri_kuin( Paivamaara toinen_paivamaara ) { return ( tama_paiva != toinen_paivamaara.paiva() || tama_kuukausi != toinen_paivamaara.kuukausi() || tama_vuosi != toinen_paivamaara.vuosi() ) ; } public boolean 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 boolean 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 String toString() { String paiva_stringina = String.format( "%02d", tama_paiva ) ; String kuukausi_stringina = String.format( "%02d", tama_kuukausi ) ; String vuosi_stringina = "" + tama_vuosi ; 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 ; } }