Projekt

Allgemein

Profil

Feature #757 » no_zeller.c

Maximilian Seesslen, 09.04.2026 16:06

 
1
// 0 = Sonntag, 1 = Montag, ... 6 = Samstag
2
int weekday(int y, int m, int d)
3
{
4
    if (m < 3) {
5
        m += 12;
6
        y -= 1;
7
    }
8
    int K = y % 100;
9
    int J = y / 100;
10
    int w = (d + (13*(m + 1))/5 + K + K/4 + J/4 + 5*J) % 7;
11
    return (w + 6) % 7; // umwandeln zu 0=Sonntag
12
}
13

    
14
int last_sunday_of_month(int year, int month)
15
{
16
    static const int mdays[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
17
    int days = mdays[month-1];
18

    
19
    // Schaltjahr berücksichtigen
20
    if (month == 2 && ((year%4==0 && year%100!=0) || (year%400==0)))
21
        days = 29;
22

    
23
    // Wochentag des letzten Tages
24
    int w = weekday(year, month, days);
25

    
26
    // Wenn letzter Tag Sonntag ist → days
27
    return days - w;
28
}
29

    
30
int is_dst_europe(int year, int month, int day, int hour)
31
{
32
    int start = last_sunday_of_month(year, 3);   // letzter Sonntag im März
33
    int end   = last_sunday_of_month(year, 10);  // letzter Sonntag im Oktober
34

    
35
    // Vor März → Winterzeit
36
    if (month < 3) return 0;
37
    // Nach Oktober → Winterzeit
38
    if (month > 10) return 0;
39

    
40
    // April bis September → immer Sommerzeit
41
    if (month > 3 && month < 10) return 1;
42

    
43
    // März: Wechsel um 02:00
44
    if (month == 3) {
45
        if (day < start) return 0;
46
        if (day > start) return 1;
47
        return (hour >= 2);
48
    }
49

    
50
    // Oktober: Wechsel um 03:00
51
    if (month == 10) {
52
        if (day < end) return 1;
53
        if (day > end) return 0;
54
        return (hour < 3);
55
    }
56

    
57
    return 0;
58
}
(2-2/3)