⌛ Päivämäärä ja aika

Aseta vastauksesi tiedostoihin Date.java, DateTime.java ja DateException.java kansiossa Round5/datetime Git-tietovarastossasi.

Tässä tehtävässä kokeillaan perintää toteuttamalla seuraavat yksinkertaiset luokat päivämäärän ja mahdollisesti myös kellonajan käsittelyyn.

  • Luokka Date, joka tallettaa päivämäärän eli päivän, kuukauden ja vuoden. Julkiset jäsenet:

    • Rakennin Date(int year, int month, int day), joka alustaa olion kuvaamaan parametrien mukaista päivämäärää. Rakennin tarkistaa, onko päivämäärä laillinen, ja ellei se ole, heittää rakennin DateException-poikkeuksen, jolla on muotoa “Illegal date day.month.year” oleva viesti. Päivä ja kuukausi esitetään kahdella numeromerkillä.

      • Voit käyttää päivämäärän tarkistamiseen esimerkiksi ensimmäisessä Java-materiaalissa esitettyä päivämäärän tarkistusesimerkkiä.

    • Jäsenfunktiot int getYear(), int getMonth() ja int getDay(), jotka palauttavat nimiään vastaavat jäsenmuuttujat.

    • Jäsenfunktio String toString(), joka palauttaa olion päivämäärän muodossa “day.month.year” esittävän merkkijonon. Päivä ja kuukausi esitetään kahdella numeromerkillä.

  • Luokka DateTime, joka perii luokan Date ja joka itse tallettaa lisäksi kellonajan eli tunnit, minuutit ja sekunnit. Julkiset jäsenet:

    • Rakennin DateTime(int year, int month, int day, int hour, int minute, int second), joka alustaa olion kuvaamaan parametrien mukaista päivämäärää ja kellonaikaa. Rakennin tarkistaa, onko kellonaika laillinen (tunnit 0-23, minuutit ja sekunnit 0-59), ja ellei se ole, heittää rakennin DateException-poikkeuksen, jolla on muotoa “Illegal time hour:minute:second” oleva viesti. Kukin kellonajan osa esitetään kahdella numeromerkillä.

    • Jäsenfunktiot int getHour(), int getMinute() ja int getSecond(), jotka palauttavat nimiään vastaavat jäsenmuuttujat.

    • Jäsenfunktio String toString(), joka palauttaa merkkijonon, jossa on ensin yliluokan Date toString-funktion tuottama merkkijono, sitten välilyönti, ja sitten kellonaika muodossa “hour:minute:second”. Kukin kellonajan osa esitetään kahdella numeromerkillä.

      • Funktiossa voi kutsua yliluokan toString-funktiota avainsanan super avulla tapaan super.toString(). Suorita tämä kutsu, ja liitä sen palauttaman merkkijonon perään välilyönti ja kellonaika.

  • Luokka DateException, joka perii Javan luokkakirjaston luokan Exception ja jolla on muotoa DateException(String msg) oleva rakennin, joka välittää parametrin msg yliluokan Exception rakentimelle.

Esimerkkitestejä

Automaattiset testit testaavat luokkiasi suunnilleen seuraavanlaisella testiohjelmalla:

public class DateTimeTest {
  public static void main(String args[]) {
    ArrayList<Date> dates = new ArrayList<>();
    for(String arg : args) {
      try {
        String[] parts = arg.split(" ");
        if(parts.length == 3) {
          dates.add(new Date(Integer.parseInt(parts[0]), Integer
                  .parseInt(parts[1]),
                  Integer.parseInt(parts[2])));
        }
        else if(parts.length == 6) {
          dates.add(new DateTime(Integer.parseInt(parts[0]), Integer.parseInt(
                  parts[1]), Integer.parseInt(parts[2]), Integer
                  .parseInt(parts[3]), Integer.parseInt(parts[4]), Integer
                  .parseInt(parts[5])));
        }
      }
      catch(DateException e) {
        System.out.println(e);
      }
    }
    for(int i = 0; i < dates.size(); i++) {
      System.out.format("Date #%d: %s%n", i + 1, dates.get(i));
    }
  }
}

Alla on kuvattu esimerkiksi kaksi testiohjelman suoritusta odotettuine tuloksineen:

java DateTimeTest "2015 1 1" "1999 12 31 23 59 59" "2012 13 20"

DateException: Illegal date 20.13.2012
Date #1: 01.01.2015
Date #2: 31.12.1999 23:59:59

java DateTimeTest "1998 01 24" "1999 02 03 17 60 17" "2010 01 20 6 55 12" "2012 07 28" "2021 02 02"

DateException: Illegal time 17:60:17
Date #1: 24.01.1998
Date #2: 20.01.2010 06:55:12
Date #3: 28.07.2012
Date #4: 02.02.2021

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.