Was macht die Klasse?

Hallo, ich frage mich, was der Folgende Code ausgibt und wieso er das tut:
Java:
import static java.lang.Integer.parseInt;

import java.util.Calendar;

public class CleanMe {

    static String[] weekDays = new String[] { "Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur" };

    static void setCalendarDate(final Calendar cal, final String date, final String sep) {
        final String[] fs = date.split(sep);
        cal.set(parseInt(fs[0]), parseInt(fs[1]) - 1, parseInt(fs[2]));
    }

    public static void main(final String[] args) {
        final Calendar cal = Calendar.getInstance();
        if (args.length >= 1) {
            if (args[0].indexOf("-") >= 0) {
                setCalendarDate(cal, args[0], "-");
            } else if (args[0].indexOf("/") >= 0) {
                setCalendarDate(cal, args[0], "/");
            } else if (args[0].indexOf(".") >= 0) {
                final String[] fs = args[0].split(".");
                cal.set(parseInt(fs[0]), parseInt(fs[1]) - 1, parseInt(fs[2]));
            }
        }
        final int wd = cal.get(Calendar.DAY_OF_WEEK);
        System.out.printf("%sday\n", weekDays[wd - 1]);
    }

}
Ich würde mich über eine Rückmeldung sehr freuen.
 
Zuletzt bearbeitet von einem Moderator:
Probier es doch einfach mal aus?
Das wird schwer wenn niklas nicht weiß was der Code tut, schließlich muss er entsprechende Eingabeparameter mitgeben.

ich frage mich, was der Folgende Code ausgibt und wieso er das tut:
Gehe Zeile für Zeile durch und kommentiere ihn dir, falls notwendig Du kannst dir den Code so umsortieren, dass er etwa der groben Ausführungsreihenfolge entspricht

Dein Code erwartet Eingabeparameter, mindestens einen. Es wird auch nur der erste Eingabeparameter ausgewertet, der Rest wird ignoriert.

Dieser erste Eingabeparameter wird auf das Vorhandensein von entweder - . oder / ausgewertet und auf das gefundene Zeichen geteilt. Der folgende Code suggeriert, dass der Code immer 3 Teile erwartet. Diese 3 Teile sollen außerdem in einen Integer umgewandelt werden. Also erwartet der Code Parameter in der Form xx.xx.xx xx/xx/xx bzw. xx-xx-xx wobei xx immer ein ganzzahliger Wert ist. Anschließend werden diese 3 Teile verwendet, um die set-Methode in der Calendar Instanz aufzurufen.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Calendar.html#set(int,int,int)

Die 3 Teile sind also Jahr, Monat und Tag in dieser Reihenfolge. Der erwartete Eingabeparameter ist entsprechend yyyy/MM/dd, yyyy-MM-dd oder yyyy.MM.dd.

Nachdem der Tag dem Kalendar bekannt ist wird mit der get-Methode eine Eigenschaft des Datums hinterfragt.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Calendar.html#get(int)
Die hinterfragte Eigenschaft ist durch die Konstante Calendar.DAY_OF_WEEK definiert.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Calendar.html#DAY_OF_WEEK
Die Eigenschaft ist ein int Wert von [1, 7] und beginnt bei der Sonntags-Entsprechung. Das Dekrement von diesem Wert entspricht dem Index im Array, in welchem sich letztlich "Übersetzungen" für diesen Zahlenwert befinden. Diese "Übersetzung" wird dann ausgegeben. printf ist eine spezielle Methode zur Formatierung der Werte. %s steht dabei für einen String, den du nach dem Komma angibst. Der String ist dabei die "Übersetzung" aus dem Array. Es wird noch "day" an diese Ausgabe angehangen (steht nach dem %s). Das Resultat ist ein vollständiger Tagesname in Englisch.

Falls kein Parmater mit / - oder . gegeben war verwendet das Programm das Default-Datum.
An instant in time can be represented by a millisecond value that is an offset from the Epoch, January 1, 1970 00:00:00.000 GMT (Gregorian).
Ich glaube das müsste ein Donnerstag sein.

Speziell anzumerken ist, dass der Teil bei . theoretisch genau das Gleiche tut wie bei / und -. Bei / und - wird die Funktionalität nur in eine Methode ausgelagert. Hier gibt es aber einen kleinen Haken, warum ich auch sagte theoretisch und oben so getan habe als wäre es so. Der Haken: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#split(java.lang.String)
Siehst du es? Ja? Nein? Ich verrate es dir, es ist das Wort Regular Expression. Der Punkt hat dort eine besondere Bedeutung - ein beliebiges Zeichen. Es kann also nicht funktionieren wie gewollt. Der Code wird vermutlich entweder in eine ArrayIndexOutOfBoundException oder NumberFormatException laufen. Lösung: Den Punkt escapen

Kurz zusammengefasst macht der Code abgesehen von dem Fehler Folgendes: Parsed ein Datum in den oben erwähnten Formaten und gibt den Wochentag dieses Datum mit dem englischen Bezeichner aus.
 
Zuletzt bearbeitet:
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben