Autor
Nachricht
Erhard Henkes
Mitglied
Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Erhard Henkes Mitglied
22:34:22 01.11.2011 Titel:
Funktion zur Berechnung des Wochentages
Zitieren
Bin gerade über diese Funktion gestolpert:
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
day += 6; // 1.1.2000 was a saturday
day += (year-2000)*365.25;
if (month > 11)
day+=334;
else if (month > 10)
day+=304;
else if (month > 9)
day+=273;
else if (month > 8)
day+=243;
else if (month > 7)
day+=212;
else if (month > 6)
day+=181;
else if (month > 5)
day+=151;
else if (month > 4)
day+=120;
else if (month > 3)
day+=90;
else if (month > 2)
day+=59;
else if (month > 1)
day+=31;
if (year%4 == 0 && (month < 2 || (month == 2 && day <= 28)))
{
day--;
}
return (day%7+1);
}
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
day += 6; // 1.1.2000 was a saturday
day += (year-2000)*365.25;
if (month > 11)
day+=334;
else if (month > 10)
day+=304;
else if (month > 9)
day+=273;
else if (month > 8)
day+=243;
else if (month > 7)
day+=212;
else if (month > 6)
day+=181;
else if (month > 5)
day+=151;
else if (month > 4)
day+=120;
else if (month > 3)
day+=90;
else if (month > 2)
day+=59;
else if (month > 1)
day+=31;
if (year%4 == 0 && (month < 2 || (month == 2 && day <= 28)))
{
day--;
}
return (day%7+1);
}
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
day += 6; // 1.1.2000 was a saturday
day += (year-2000)*365.25;
if (month > 11)
day+=334;
else if (month > 10)
day+=304;
else if (month > 9)
day+=273;
else if (month > 8)
day+=243;
else if (month > 7)
day+=212;
else if (month > 6)
day+=181;
else if (month > 5)
day+=151;
else if (month > 4)
day+=120;
else if (month > 3)
day+=90;
else if (month > 2)
day+=59;
else if (month > 1)
day+=31;
if (year%4 == 0 && (month < 2 || (month == 2 && day <= 28)))
{
day--;
}
return (day%7+1);
}
So richtig elegant sieht das noch nicht aus. Vielleicht hat jemand eine bessere Idee, wie man das kompakt lösen kann.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
dot Mitglied
22:38:58 01.11.2011 Titel:
Zitieren
Erhard Henkes
Mitglied
Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Erhard Henkes Mitglied
22:45:25 01.11.2011 Titel:
Zitieren
Das sieht ja noch schrecklicher aus.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
dot Mitglied
22:49:31 01.11.2011 Titel:
Zitieren
Ist aber korrekt (im Gegensatz zu obiger Funktion)
_________________ one point of view will never reveal the entire scene.
Erhard Henkes
Mitglied
Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Erhard Henkes Mitglied
22:56:39 01.11.2011 Titel:
Zitieren
Kannst du das nach C übersetzen mit obigen Parametern?
Hier im Forum gefunden:
C/C++ Code: 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
dayofweek(int y, int m, int d) /* 0 = Sonntag */
/* 1 <= m <= 12, y > 1752 oder so */
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
C/C++ Code: 1 2 3 4 5 6 7 8 9
dayofweek(int y, int m, int d) /* 0 = Sonntag */
/* 1 <= m <= 12, y > 1752 oder so */
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
C/C++ Code: 1 2 3 4 5 6 7 8 9
dayofweek(int y, int m, int d) /* 0 = Sonntag */
/* 1 <= m <= 12, y > 1752 oder so */
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
Zitat: im Gegensatz zu obiger Funktion
Bisher wurde der Wochentag korrekt berechnet, aber ich traue der sache auch nicht.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 23:02:54 01.11.2011, insgesamt 2-mal bearbeitet
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
dot Mitglied
23:01:36 01.11.2011 Titel:
Zitieren
Erhard Henkes schrieb: Bisher wurde der Wochentag korrekt berechnet, aber ich traue der sache auch nicht.
Im Jahr 2100 stimmts nimmer, soweit ich das sehen kann, das ist nämlich kein Schaltjahr
_________________ one point of view will never reveal the entire scene.
Zuletzt bearbeitet von dot am 23:02:24 01.11.2011, insgesamt 2-mal bearbeitet
neuer_user
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.12.2010
Beiträge: 210
neuer_user Mitglied
23:22:48 01.11.2011 Titel:
Zitieren
ich hab mal so angefangen:
EDIT: (angefangen heißt nicht fertig )
EDIT2: ist auch irgendwie falsch
Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
//1.1.2000 was Saturday
size_t day_ = 0;
int32_t diff_day = 1-day;
int32_t diff_year = 2000-year;
uint8_t schaltjahr[diff_year+1];
for(int i = 0;i < diff_year+1;i++)
{
if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
schaltjahr[i] = 1;
else
schaltjahr[i] = 0;
}
if(diff_year > 0)
{
for(int i = 0;i < diff_year;i++)
{
day_ += 365+schaltjahr[i];
}
}
}
Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
//1.1.2000 was Saturday
size_t day_ = 0;
int32_t diff_day = 1-day;
int32_t diff_year = 2000-year;
uint8_t schaltjahr[diff_year+1];
for(int i = 0;i < diff_year+1;i++)
{
if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
schaltjahr[i] = 1;
else
schaltjahr[i] = 0;
}
if(diff_year > 0)
{
for(int i = 0;i < diff_year;i++)
{
day_ += 365+schaltjahr[i];
}
}
}
Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
//1.1.2000 was Saturday
size_t day_ = 0;
int32_t diff_day = 1-day;
int32_t diff_year = 2000-year;
uint8_t schaltjahr[diff_year+1];
for(int i = 0;i < diff_year+1;i++)
{
if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
schaltjahr[i] = 1;
else
schaltjahr[i] = 0;
}
if(diff_year > 0)
{
for(int i = 0;i < diff_year;i++)
{
day_ += 365+schaltjahr[i];
}
}
}
Zuletzt bearbeitet von neuer_user am 23:33:51 01.11.2011, insgesamt 2-mal bearbeitet
Erhard Henkes
Mitglied
Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Erhard Henkes Mitglied
23:30:30 01.11.2011 Titel:
Zitieren
da kommt noch kein Wochentag zurück ^^
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Erhard Henkes
Mitglied
Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Erhard Henkes Mitglied
23:36:55 01.11.2011 Titel:
Zitieren
Es ist interessant, wenn man höhere Jahreszahlen mit Emulatoren oder Windows testen will:
- qemu bricht sofort beim Start zusammen (ganz erbärmlich)
- Datum/Zeit von Win XP endet im Jahr 2099 (Unverschämtheit!)
- der GNU-Compiler gerät aus dem Takt, wenn man 2099 einstellt (merkwürdig)
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 23:56:45 01.11.2011, insgesamt 1-mal bearbeitet
neuer_user
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.12.2010
Beiträge: 210
neuer_user Mitglied
23:47:31 01.11.2011 Titel:
Zitieren
Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
//1.1.2000 was Saturday
size_t day_ = 5;
int32_t diff_year = year-2000;
uint8_t schaltjahr[diff_year+1];
//calculate Schaltjahre
for(int i = 0;i < diff_year+1;i++)
{
if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
schaltjahr[i] = 1;
else
schaltjahr[i] = 0;
}
//add days of diff. of years
if(diff_year > 0)
{
for(int i = 0;i < diff_year;i++)
{
day_ += 365+schaltjahr[i];
}
}
//Month
if(month > 1)
{
for(int i = 0;i < month-1;i++)
{
if(month-1+i == 2)
{
if(schaltjahr[year])
day_ += 29;
else
day_ += 28;
}
else
{
if((month-1+i)%2 == 1)
day_ += 31;
else
day_ += 30;
}
}
}
//add diff.day
day_ += day-1;
return day_%7;
}
Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
//1.1.2000 was Saturday
size_t day_ = 5;
int32_t diff_year = year-2000;
uint8_t schaltjahr[diff_year+1];
//calculate Schaltjahre
for(int i = 0;i < diff_year+1;i++)
{
if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
schaltjahr[i] = 1;
else
schaltjahr[i] = 0;
}
//add days of diff. of years
if(diff_year > 0)
{
for(int i = 0;i < diff_year;i++)
{
day_ += 365+schaltjahr[i];
}
}
//Month
if(month > 1)
{
for(int i = 0;i < month-1;i++)
{
if(month-1+i == 2)
{
if(schaltjahr[year])
day_ += 29;
else
day_ += 28;
}
else
{
if((month-1+i)%2 == 1)
day_ += 31;
else
day_ += 30;
}
}
}
//add diff.day
day_ += day-1;
return day_%7;
}
Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
//1.1.2000 was Saturday
size_t day_ = 5;
int32_t diff_year = year-2000;
uint8_t schaltjahr[diff_year+1];
//calculate Schaltjahre
for(int i = 0;i < diff_year+1;i++)
{
if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
schaltjahr[i] = 1;
else
schaltjahr[i] = 0;
}
//add days of diff. of years
if(diff_year > 0)
{
for(int i = 0;i < diff_year;i++)
{
day_ += 365+schaltjahr[i];
}
}
//Month
if(month > 1)
{
for(int i = 0;i < month-1;i++)
{
if(month-1+i == 2)
{
if(schaltjahr[year])
day_ += 29;
else
day_ += 28;
}
else
{
if((month-1+i)%2 == 1)
day_ += 31;
else
day_ += 30;
}
}
}
//add diff.day
day_ += day-1;
return day_%7;
}
Ich hab das noch nicht überprüft aber bei Montag sollte 0 rauskommen
Zuletzt bearbeitet von neuer_user am 23:49:29 01.11.2011, insgesamt 1-mal bearbeitet
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum nicht antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.