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

Tehtävän palautus koostuu Maven-projektista. Sijoita pom.xml-tiedosto paikallisen tietovarastosi round5/datetime-hakemistoon ja tee tähän hakemistoon src/main/java-niminen alihakemisto. Tee luokkatiedostot Date.java, DateTime.java ja DateException.java ja liitä ne fi.tuni.prog3.datetime-nimiseen pakkaukseen. Tiedostojesi tulee olla siten hakemistossa round5/datetime/src/main/java/fi/tuni/prog3/datetime.

Tässä tehtävässä tutustutaan perintään toteuttamalla seuraavat luokat päivämäärän ja 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ä. vinkki: String.format ja "%02d" muotoilumäärittely.

      • Voit käyttää päivämäärän tarkistamiseen esimerkiksi aiemmassa 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.

Automaattiset sekä alla kuvatut testit olettavat, että teet projektitiedostoosi pom.xml seuraavat määritykset:

  • artifactId-elementin arvo on datetime.

  • version-elementin arvo on 1.0.

  • maven.compiler.source ja maven.compiler.target -elementtien arvo on 17 tai pienempi. Tarkistimella on asennettuna Java 17, joten tätä uudempaa versiota ei voi käyttää.

  • Onejar-liitännäisen määritys, jonka mainClass-elementin arvo on DateTimeTest, joka on alla kuvattu valmiina annettu testiluokka.

Esimerkkitestejä

Automaattiset testit testaavat luokkiasi suunnilleen seuraavanlaisella testiohjelmalla:

import java.util.ArrayList;
import fi.tuni.prog3.datetime.Date;
import fi.tuni.prog3.datetime.DateException;
import fi.tuni.prog3.datetime.DateTime;
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 -jar target/datetime-1.0.one-jar.jar "2015 1 1" "1999 12 31 23 59 59" "2012 13 20"

fi.tuni.prog3.datetime.DateException: Illegal date 20.13.2012
Date #1: 01.01.2015
Date #2: 31.12.1999 23:59:59

java -jar target/datetime-1.0.one-jar.jar "1998 01 24" "1999 02 03 17 60 17" "2010 01 20 6 55 12" "2012 07 28" "2021 02 02"

fi.tuni.prog3.datetime.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.