Sommerzeit herausfinden...


  • Gesperrt

    Könnt ihr mal schauen, ob ich hier in C etwas gemacht habe, was man eigentlich nicht so machen sollte?

    Es soll herausgefunden werden, ob gerade Sommerzeit ist ...

    #include <iostream>
    
    int weekdayFromDate(int year, int month, int day)
    {
        if (month < 3)
        {
            year--;
            month += 12;
        }
        int wd = (day + 2 * month + (3 * month + 3) / 5 + year + year / 4 - year / 100 + year / 400 + 1) % 7;
        return (wd + 6) % 7 + 1;
    }
    
    bool isLeapYear(int year)
    {
        return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    }
    
    const int days1[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int days2[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    const int *getDaysArray(int year)
    {
        if (isLeapYear(year))
        {
            return days2;
        }
        return days1;
    }
    
    int dayOfYearFromDate(int year, int month, int day)
    {
        const int *days = getDaysArray(year);
        int sum = 0;
        for (int i = 0; i < month - 1; i++)
        {
            sum += days[i];
        }
        return sum + day;
    }
    
    void dateFromDayOfYear(int year, int dayOfYear, int *result)
    {
        const int *days = getDaysArray(year);
        result[0] = year;
        result[1] = 1;
        for (int i = 0; i < 12; i++)
        {
            if (dayOfYear > days[i])
            {
                dayOfYear -= days[i];
                result[1]++;
            }
        }
        result[2] = dayOfYear;
    }
    
    int dateOfLastSundayInMarch(int year)
    {
        int march = dayOfYearFromDate(year, 3, 31);
        int wd = weekdayFromDate(year, 3, 31);
        return march - (wd % 7);
    }
    
    int dateOfLastSundayInOctober(int year)
    {
        int october = dayOfYearFromDate(year, 10, 31);
        int wd = weekdayFromDate(year, 10, 31);
        return october - (wd % 7);
    }
    
    bool isSummertimeAt(int year, int month, int day)
    {
        int date = dayOfYearFromDate(year, month, day);
        int lastSundayInMarch = dateOfLastSundayInMarch(year);
        int lastSundayInOctober = dateOfLastSundayInOctober(year);
        return date >= lastSundayInMarch && date < lastSundayInOctober;
    }
    
    int main(int argc, char const *argv[])
    {
        // Examples:
        std::cout << weekdayFromDate(2023, 1, 1) << "\n"; // 7 = Sunday
        std::cout << weekdayFromDate(2023, 1, 2) << "\n"; // 1 = Monday
        std::cout << weekdayFromDate(2023, 1, 3) << "\n"; // 2 = Tuesday
        std::cout << weekdayFromDate(2023, 1, 4) << "\n"; // 3 = Wednesday
        std::cout << weekdayFromDate(2023, 1, 5) << "\n"; // 4 = Thursday
        std::cout << weekdayFromDate(2023, 1, 6) << "\n"; // 5 = Friday
        std::cout << weekdayFromDate(2023, 1, 7) << "\n"; // 6 = Saturday
        std::cout << weekdayFromDate(2023, 1, 8) << "\n"; // 7 = Sunday
        std::cout << weekdayFromDate(2023, 1, 9) << "\n"; // 1 = Monday
    
        std::cout << isSummertimeAt(2023, 1, 1) << "\n";   // false = not within summertime
        std::cout << isSummertimeAt(2023, 12, 31) << "\n"; // false = not within summertime
        std::cout << isSummertimeAt(2023, 3, 25) << "\n";  // false = not within summertime
        std::cout << "\n";
        std::cout << isSummertimeAt(2023, 3, 26) << "\n";  // true = within summertime
        std::cout << isSummertimeAt(2023, 6, 1) << "\n";   // true = within summertime
        std::cout << isSummertimeAt(2023, 10, 28) << "\n"; // true = within summertime
        std::cout << "\n";
        std::cout << isSummertimeAt(2023, 10, 29) << "\n"; // false = not within summertime
    
        int result[3];
        dateFromDayOfYear(2024, 60, result);
        std::cout << result[0] << "-" << result[1] << "-" << result[2] << "\n";  // 2024 2 29
        dateFromDayOfYear(2024, 61, result);
        std::cout << result[0] << "-" << result[1] << "-" << result[2] << "\n";  // 2024 3  1
        std::cout << dayOfYearFromDate(result[0], result[1], result[2]) << "\n"; // 61
    
        return 0;
    }
    


  • Das funktioniert so nicht, du brauchst auch eine Uhrzeit. Es wird ja nicht um Mitternacht umgestellt, sondern von 2 auf 3 Uhr bzw es gibt die Stunde 2 Uhr bis 3 Uhr doppelt, wenn in die andere Richtung gestellt wird. Außerdem hängt das Umstelldatum vom Land ab (und vom Jahr, weil sich Regeln gerne mal ändern). Auch in Deutschland kann ich mich noch an die Umstellung September erinnern, die ja inzwischen im Oktober ist (Edit: das war bis inklusive 1995). Daher habe ich deinen Code gar nicht weiter angeschaut.

    Suche dir eine Bibliothek, die das macht. Du könntest mit https://en.cppreference.com/w/cpp/chrono/time_zone anfangen. Bzw hier gucken: https://howardhinnant.github.io/date/tz.html#current_local


  • Gesperrt

    @wob sagte in Sommerzeit herausfinden...:

    Das funktioniert so nicht, du brauchst auch eine Uhrzeit.

    Ja, das hab ich mir auch schon gedacht. Aber zur Vereinfachung soll Folgendes angenommen werden:

    1. In 2023 soll am gesamten 26.03. Sommerzeit herrschen und
    2. im gesamten 29.10. Winterzeit herrschen usw. (also von 00:00:00 bis EoD 23:59:59)
    3. Die momentan geltende Regelung soll auch in der Zukunft und Vergangenheit so gelten (also gewissermaßen nicht historisch korrekt).

    @wob sagte in Sommerzeit herausfinden...:

    Suche dir eine Bibliothek, die das macht.

    Ich will das Üben, ohne Bibliothek. 🤡 😉




  • Gesperrt

    @Cardiac sagte in Sommerzeit herausfinden...:

    man uebt nicht mit zeitkrams. und hier ist der grund dafuer

    Danke, das war äußerst amüsierend... 😉


Anmelden zum Antworten