Wochentag ermitteln

kukuk

kukuk

App-Anbieter (kostenlos)
29
Ist es möglich festzustellen ob welcher Wochentag heute ist? Also Mo-Sonntag?


Mit freundlichen Grüßen
 
Ja
 
  • Danke
Reaktionen: reiga, ui_3k1, kleinerkathe und 4 andere
Ich würde für das ganze Datum-, Zeitzeugs JodaTime empfehlen. Ist sehr umfangreich und bietet sehr viele Hilfsmethoden, unter anderem womit man den Wochentag ermittlen kann (als Integer)!

Liebe Grüße,
Patrick
 
Ob man dafür wirklich den Google Kalender braucht... Benötigt die App schon wieder Internet. Wäre ja auch recht einfach möglich ein fixes Datum zu nehmen (sagen wir heute) und dann "hoch zu zählen". Das einzige was bedacht werden muss sind Schaltjahre...

Immer: Jahr % 4 == 0 -> Schaltjahr
bei % 100 == 0 -> Sonderfall 1: kein Schaltjahr, obwohl durch 4 teilbar
bei % 400 == 0 -> Sonderfall 2: ist Schaltjahr, obwohl durch 100 teilbar
und dann sollte man noch dran denken dass es im Jahre 1382(?) ein paar Tage nicht gab, weil da irgendwelche Hexen verbrannt wurden (oder irgendwie so) :D
 
ui_3k1 schrieb:
Ob man dafür wirklich den Google Kalender braucht... Benötigt die App schon wieder Internet.
Was für ein Googlekalender? Wozu Internet?
KatyB hat doch den passenden Link zu der entsprechenden Klasse aus der Standard Java Lib gepostet.
Das ist ein Dreizeiler:
Code:
Calendar cal = new GregorianCalendar();
cal.setTime( new Date() );  // Datum von heute
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
 
  • Danke
Reaktionen: kosmus
Okay, sehe es gerade. Naja, jetzt hab ich wieder was gelernt: nämlich was es für eine tolle Java-Lib gibt. ;)
Trotzdem, ich hoffe es wirkt nicht allzu "oberlehrerhaft", aber wenn jemand fragt, ob es möglich ist den Wochentag zu ermitteln, zeigt das, dass derjenige von Programmierung nicht allzu viel Ahnung hat. Ist ja auch keinesfalls schlimm. Das Verständnis für die Sache kommt mit der Zeit durch Übung und es ist noch kein Meister vom Himmel gefallen (und ich sowieso nicht^^) - ABER ob es dann so gut ist demjenigen eine Lib an die Hand zu geben, aus der er sich alles "leeched", wage ich zu bezweifeln. Verstanden hat es derjenige deshalb nicht.
Und wie du selbst sagst "Das ist ein Dreizeiler" -> stimmt! Und der Lernerfolg geht bei dem Dreizeiler gegen Null, mehr als ein paar Initialisierungen kann ich dem Code nicht entnehmen. :)
 
Zuletzt bearbeitet:
Nee, das wirkt nicht oberlehrerhaft. Ich finde es auch besser wenn man sich erstmal tiefergehend mit Programmier-Aufgaben beschäftigt aber in dem Fall wird man mit der von dir vorgeschlagenen Lösung nur sehr sehr umständlich ans Ziel kommen (Du musst dir ja dann zu jedem Monat die Anzahl der Tage merken und deine aufgelisteten Ausnahmeregeln beachten etc. etc.. Das wird ein nicht zu unterschätzender Algorithmus).
Kann sein, dass es dem Threadersteller um den Lerneffekt bzgl. Datumsberechnungen oder generell ein Lerneffekt beim Algorithmischen Denken geht aber dann hätte er das wahrscheinlich dazu geschrieben.
Ich glaube er hat mit dem Dreizeiler gelernt, dass es für Datumsberechnungen eine Standard-Lib in Java gibt die man noch nichtmal extra einbinden muss. Wenn er die Lib jetzt kennt kann er damit wahrscheinlich noch weitere Aufgaben viel schneller und effizienter lösen.

Gruß
Jarny
 
  • Danke
Reaktionen: ui_3k1
Genau, 1582 war es :)
Hab da mal vor längerem mal eine Klasse für geschrieben (wahrscheinlich lässt sich im Code noch einiges optimieren, musste damals schnell fertig werden).

Code:
#include "Date.h"
#include "iomanip"

Date::Date(int yy, Month mm, int dd) // Konstruktor-Definition
: y(yy), m(mm), d(dd) {
    //if (!check()) throw Date::Invalid();
}

Date::Date() //STANDARDKONSTRUKTOR DEFAULTWERT
: y(1876), m(Jan), d(1) {
}

Date::~Date() {
}

int Date::get_y() const {
    return y;
}

int Date::get_d() const {
    return d;
}

std::string Date::toString(int k) const {
    std::string s = "";
    switch (k) {
        case 1:
            s = "Jan";
            break;
        case 2:
            s = "Feb";
            break;
        case 3:
            s = "Mrz";
            break;
        case 4:
            s = "Apr";
            break;
        case 5:
            s = "Mai";
            break;
        case 6:
            s = "Jun";
            break;
        case 7:
            s = "Jul";
            break;
        case 8:
            s = "Aug";
            break;
        case 9:
            s = "Sep";
            break;
        case 10:
            s = "Okt";
            break;
        case 11:
            s = "Nov";
            break;
        case 12:
            s = "Dez";
            break;
    }
    return s;
}

void Date::add_days() {
    d++;
}

void Date::show_date() {
    std::cout << get_y() << "-" << toString(m) << "-" << std::setfill('0') << std::setw(2) << get_d() << std::endl;
}

void Date::add_months(int mi) {
    int mx = m;
    std::string sm = "";
    mx += mi;
    sm = toString(mx);
    if (!check()) throw Date::Invalid();
}

bool Date::check() {
    //JAHR ZWISCHEN 1800 UND 2200
    if (y > 2200 || y < 1800) {
        //        std::cout << "Datum zu weit in der Vergangenheit/Zukunft!" << std::endl;
        return false;
    }

    //MONAT ZWISCHEN 1 UND 12
    if (m > Dez || m < Jan) {
        //        std::cout << "Den " << m << ". Monat gibt es nicht!" << std::endl;
        return false;
    }

    //MONATE MIT 30 TAGEN
    switch (m) {
        case Feb: // noch ohne Schaltjahre
            if (d > 28) {
                if (d == 30 || d == 31) {
                    //                    std::cout << "Der Februar hat maximal 29 Tage!" << std::endl;
                    return false;
                }
                if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
                    if (m == Feb && d == 29) {
                        //                        std::cout << "Genau! Schaltjahr hat den 29. Feb!" << std::endl;
                        return true;
                    }
                } else {
                    //                    std::cout << "Kein Schaltjahr, daher auch kein 29. Feb!" << std::endl;
                    return false;
                }
            }
        case Apr: case Jun: case Sep: case Nov:
            if (d > 30) {
                //                std::cout << "Dieser Monat hat nie mehr als 30 Tage!" << std::endl;
                return false;
            }
        default:
            if (d > 31) {
                //                std::cout << "Ein Monat hat nie mehr als 31 Tage!" << std::endl;
                return false;
            }
    }
    //    std::cout << "Dieser Tag existiert!" << std::endl;
    return true;
}

bool Date::checkDayUp() {
    switch (mx) {
        case 2:
            if (d > 27) {
                if (d == 29 || d == 30) {
                    return false;
                }
                if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
                    if (mx == 2 && d == 28) {
                        return true;
                    }
                } else {
                    return false;
                }
            }
        case 4: case 6: case 9: case 11:
            if (d > 29) {
                return false;
            }
        default:
            if (d > 30) {
                return false;
            }
    }
    return true;
}

bool Date::checkDayDown() {
    switch (mx) {
        case 2:
            if (d < 2) {
                return false;
            }
        case 4: case 6: case 9: case 11:
            if (d < 2) {
                return false;
            }
        default:
            if (d < 2) {
                return false;
            }
    }
    return true;
}

bool Date::checkMonthUp() {
    if (mx > 11 || mx < 1)
        return false;
}

bool Date::checkMonthDown() {
    if (mx > 12 || mx < 2)
        return false;
}

bool Date::checkYear() {
    if (y > 2200 || y < 1800)
        return false;
}

int Date::compareTo(Date d1) {
    Date d2;
    d2.d = 18;
    d2.m = Date::Mrz;
    d2.y = 2000;

    int valueOfDay1 = d1.d + (d1.m * 12) + (d1.y * 365);
    int valueOfDay2 = d2.d + (d2.m * 12) + (d2.y * 365);

    if (valueOfDay1 == valueOfDay2)
        return 0;
    if (valueOfDay1 < valueOfDay2)
        return -1;
    if (valueOfDay1 > valueOfDay2)
        return 1;
}
                
int Date::get_month_for_calc() {
    switch (Date::m) {
        case Jan: return 1;
            break;
        case Feb: return 2;
            break;
        case Mrz: return 3;
            break;
        case Apr: return 4;
            break;
        case Mai: return 5;
            break;
        case Jun: return 6;
            break;
        case Jul: return 7;
            break;
        case Aug: return 8;
            break;
        case Sep: return 9;
            break;
        case Okt: return 10;
            break;
        case Nov: return 11;
            break;
        case Dez: return 12;
            break;
    }
}

void Date::inc_day(int howMany) {
    mx = get_month_for_calc();
    while (howMany > 0) {
        if (checkDayUp()) {
            d++;
        } else if (checkMonthUp()) {
            d = 1;
            mx++;
        } else if (checkYear()) {
            mx = 1;
            d = 1;
            y++;
        }
        std::cout << get_y() << "-" << std::setfill('0') << std::setw(2) << toString(mx) << "-" << std::setfill('0') << std::setw(2) << get_d() << std::endl;
        howMany--;
    }
}

void Date::dec_day(int howMany) {
    mx = get_month_for_calc();
    while (howMany > 0) {
        if (checkDayDown()) {
            d--;
        } else if (checkMonthDown()) {
            mx--;
            switch (mx) {
                case 1: d = 31;
                    break;
                case 2:
                    if (d == 28 && y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
                        d = 29;
                    else
                        d = 28;
                    break;
                case 3: d = 31;
                    break;
                case 4: d = 30;
                    break;
                case 5: d = 31;
                    break;
                case 6: d = 30;
                    break;
                case 7: d = 31;
                    break;
                case 8: d = 31;
                    break;
                case 9: d = 30;
                    break;
                case 10: d = 31;
                    break;
                case 11: d = 30;
                    break;
                case 12: d = 31;
                    break;
            }
        } else if (checkYear()) {
            mx = 12;
            d = 31;
            y--;
        }
        std::cout << get_y() << "-" << std::setfill('0') << std::setw(2) << toString(mx) << "-" << std::setfill('0') << std::setw(2) << get_d() << std::endl;
        howMany--;
    }
}

Date::Invalid::Invalid() {
    msg = "Invalid aufgerufen!";
}

Date::Invalid::~Invalid() {
}

std::string Date::Invalid::what() {
    return msg;
}
 
ui_3k1 schrieb:
Und wie du selbst sagst "Das ist ein Dreizeiler" -> stimmt! Und der Lernerfolg geht bei dem Dreizeiler gegen Null, mehr als ein paar Initialisierungen kann ich dem Code nicht entnehmen.

Lernerfolg? Inwiefern ist es fürs Programmieren relevant zu wissen, wie man algorithmisch einen Wochentag herausfindet? Man lernt dabei zwar vielleicht, wie man ein Jahr auf Schaltjahre prüft, aber besser programmieren kannst du deshalb nicht :razz: Speziell bei Dingen, die Java schon mitliefert.

Ich versteh zwar deine Meinung: Wenn ein Anfänger nur eine zusätzliche Netzwerk-Lib verwendet, weil er AsyncTasks/Threads/Handler nicht versteht und sich den Lernaufwand sparen will, find ich das nicht gut. Dabei beziehe ich mich aber auf die grundlegenden System-Mechaniken. Wenn man ernsthaft für Android etwas entwickeln will, soll man die wichtigsten Dinge von Android zuerst verstehen.

Dazu zähle ich aber nicht so Dinge wie die Bestimmung des Wochentags oder andere algorithmische Probleme, die für meine App nur nebensächlich relevant sind.

Als beruflicher Entwickler sehe ich es sogar eher negativ, wenn man alle Probleme selber zu lösen versucht. Viele Dinge haben erfahrerenere Leute bereits besser gelöst. Es zeigt, dass dieser Entwickler entweder nicht richtig recherchieren kann, oder noch schlimmer: dass er es gar nicht will. Eine Eigenentwicklung braucht Zeit, birgt Risiken (Bugs, Sicherheitslücken, ...) und kostet demnach ein Unternehmen möglicherweise unnötig Geld. Das soll nicht heissen, dass gleich jede verfügbare Library besser ist als eine Eigenentwicklung, aber ein beruflicher Entwickler muss zuerst gründlich recherchieren und abwägen.
 
@Zoopa: ich stimme dir in vielen Punkten zu, in der "Arbeitszeit" eines Programmierers ist es definitiv von Bedeutung in schnellstmoeglicher Zeit die beste Loesung fuer den Chef/Kunden anbieten zu koennen. Hier sind wir uns einer Meinung.

Allerdings sehe ich in der Uebung mit dem Wochentag dennoch viel Sinnvolles. Warum? Weil man sich im Vorfeld eine Loesungsstrategie ueberlegen muss und diese sich dann im Anschluss, wenn der Baustein fertig ist, ausgezeichnet pruefen laesst - gerade bei der Android-Programmierung sehe ich bei vielen Aspekten eine sinnvolle Pruefung als eher schwer praktizierbar. Jedenfalls lassen sich fuer Einsteiger kleine Konsolen-Prograemmchen definitiv einfacher debuggen und auf Korrektheit der Logik pruefen, als wenn mal wieder ein Nullpointer auftaucht. Meist ist der Nullpointer einfach nur der groben Vergesslichkeit geschuldet und dessen Behebung bringt dem Programmierer keine besondere Erleuchtung.

Aus rein fachlicher Sicht waeren meine Argumente, die fuer diese "Uebung" sprechen:
1. Einsatz von Modulo
2. Praxis mit boolschen Wahrheitswerten und deren Behandlung / Auswertung.
3. Kontakt mit Datentypen (vielleicht Anlegen einer Helferklasse)
4. Fehleranalyse und -behandlung bei "selbst durchdachter" Logik.
5. Schleifen.
6. bestimmt noch mehr...

Da du beruflich programmierst, brauche ich auf die Wichtigkeit dieser Themeninhalte nicht eingehen.
-> und das Wichtigste: wer sich etwas fuer die Programmierung interessiert, wird dieses Programm entweder ohne weitere Hilfe, oder weiteren mit kleinen Denkanstoessen, programmieren koennen.

Und wenn du dich noch an deine Anfaenge zurueck erinnern kannst, wirst du dir bestimmt auch einige Male gedacht haben "Ahh, so funktioniert das!" (wahrscheinlich waerst du sonst kein Programmierer^^). Und genau das ist doch der Aspekt, der beim Programmieren Spass macht, oder? :)

Was ich hingegen gar nicht nachvollziehen kann, sofern ich dich richtig verstanden habe, ist die Aussage "Speziell bei Dingen, die Java schon mitliefert." (... wuerde man nichts lernen, wenn man diese Dinge selbst nachbaut).
Und um dir ein ganz krasses Beispiel zu nennen: Verkettete Listen / Containertypen..
Die werden von Java mitgeliefert und werden auch von Hinz und Kunz benutzt, ohne zu wissen, wie diese funktionieren. Wie willst du bitte einen Fehler (ueberhaupt nur) finden, wenn du nicht mal weisst wie die Liste funktioniert? Spontanes Loeschen von Elementen waehrend der Laufzeit, meiner Meinung nach keine allzu spezielle Anforderung, aber trotzdem uU eine ausgiebige Fehlerquelle.
 
Zuletzt bearbeitet:
Ja mit deinem Beispiel hast du vollkommen recht. Es gibt wirklich viele grundlegende Dinge, die man dabei lernt :smile: In meiner Anfangszeit als Programmierer habe ich natürlich auch solche Dinge entwickelt, um zu lernen :thumbup:

Ich überlege wohl ein bisschen zu viel aus meiner beruflichen Sicht und meinem eigenen Kenntnisstand. Mit "Speziell bei Dingen, die Java schon mitliefert" habe ich gemeint, dass man nichts neu erfinden soll, was die Sprache bereits mitliefert. Aber dabei habe ich auch wieder vorausgesetzt, dass man weiss, wie es funktioniert. So Dinge wie verkettete Listen musste ich im Studium auch mal selber programmieren, deshalb würde ich das heutzutage kaum mehr selber machen, wenn die Sprache sowas bereits mitliefert.

Wenn jemand im Eröffnungspost nicht sagt, dass sie/er ein Programmier-Anfänger ist, gehe ich irgenwie automatisch davon aus, dass diese Person kein Anfänger ist. Das ist vielleicht falsch :tongue:
 
  • Danke
Reaktionen: ui_3k1
ui_3k1 schrieb:
Okay, sehe es gerade. Naja, jetzt hab ich wieder was gelernt: nämlich was es für eine tolle Java-Lib gibt. ;)

Eigentlich ist der gregorianCalender gar nicht so toll, deshalb wurde die Datums Berechnung in Java 8 auch erneuert :)

Aber mal ernsthaft wir sind nicht hier um Leute zu erziehen und so posts wie StefMa "ja" sind so nützlich wie ein Lutscher der nach Sch* schmeckt. Gerade bei offensichtlich leichten Problemen sollte man so wie Jarny und KatyB eine konkrete Antwort geben und wenn kukuk mehr zu dem Thema wissen will, wird er/sie schon fragen. Ich finde es schade das StefMa auch noch mehr danke Klicks damit bekommt als die anderen beiden zusammen...
 
Hallo Leute, vielen Dank für eure Hilfe.

Ich habe mir das jetzt so umgesetzt wie ich es brauche. Und ich muss sagen das es wirklich einfach war.

Manchmal brauch man nur einen anstupser ^^

Hier mal mal Code wenn irgendjemand so was ähnliches machen möchte.

Code:
        Calendar cal = new GregorianCalendar();
        
        int month = cal.get(Calendar.MONTH);
        
        int hour24 = cal.get(Calendar.HOUR_OF_DAY); 
        


        
        int day = cal.get(Calendar.DAY_OF_WEEK);
        
        
                

        
        SimpleDateFormat dateFormat = new SimpleDateFormat(
                "HHmm");
int uhrzeit = Integer.parseInt(dateFormat.format(cal.getTime()));





        if (day > 1 && day < 7 &&  uhrzeit <= 1530 && uhrzeit >= 700){
            außerhalb_der_geschäftszeiten = false;
        }else{
            
            außerhalb_der_geschäftszeiten = true;
        }
        
        if (day ==6 && uhrzeit > 1430){
            außerhalb_der_geschäftszeiten = true;
        }
        
        if (Global.stadt.equals("essen")){
            if (day == 6 && uhrzeit > 1230){
                außerhalb_der_geschäftszeiten = true;
            }
        }
 
habe ich gerade nen totalen Denkfehler oder müsste das nicht eine Oder-Verknüpfung ( || ) in den If abfragen sein

zumindest das kann doch nie true sein:
day > 1 && day < 7
 
Bsp: day = 2
Dann ist day größter als 1 UND kleiner 7 = true. Also passt.

Allerdings fallen hier 1 und 7 weg, das sollte nochmal überdacht werden (oder soll die Logik nur von di - sa laufen? :) bei Friseuren macht das ja durchaus Sinn)

Und eine andere Idee: die Klammern der Eingangsbedingung (nennt man das so?) möglichst "weit" gestalten. Eine Hauptabfrage (zB "im zulässigen Bereich" oder "Mittagszeit") und dann in dieser Bedingung weitere Abfragen starten um den aktuellen Status zu ermitteln.
 
Zuletzt bearbeitet:
gott ja ich hatte einen totalen Denkfehler < und > verdreht...
 
kosmus schrieb:
Eigentlich ist der gregorianCalender gar nicht so toll, deshalb wurde die Datums Berechnung in Java 8 auch erneuert :)

Aber mal ernsthaft wir sind nicht hier um Leute zu erziehen und so posts wie StefMa "ja" sind so nützlich wie ein Lutscher der nach Sch* schmeckt. Gerade bei offensichtlich leichten Problemen sollte man so wie Jarny und KatyB eine konkrete Antwort geben und wenn kukuk mehr zu dem Thema wissen will, wird er/sie schon fragen. Ich finde es schade das StefMa auch noch mehr danke Klicks damit bekommt als die anderen beiden zusammen...

Um Gottes Willen, die Erziehung von Menschen überlasse ich den jeweiligen Eltern :)
Mir ging es nur darum etwas zu erklären, bzw auf ein (Problematik/)Lösung hinzuweisen. Oft bin ich auch froh, wenn ich schnell auf etwas Funktionierendes, Vorgefertigtes zurückgreifen kann, keine Frage.
Das mit dem "ja" und den Danke-Klicks ist ein Argument.
 

Ähnliche Themen

E
Antworten
0
Aufrufe
706
enrem
E
4
  • 469110
Antworten
0
Aufrufe
980
469110
4
4
Antworten
4
Aufrufe
811
deek
D
Zurück
Oben Unten