Wochentag aus Datum errechnen

  • Thread starter Alex Loipführer
  • Start date
A

Alex Loipführer

Guest
Hallo,

weiß jemand wie man den Wochentag von einem Datm berechnet?
Ich will es in einem Atmel Microcontroller verwenden. Vielleicht hat ja
schon jemand einen Quelltext.

MfG Alex
 
weiß jemand wie man den Wochentag von einem Datm berechnet?
Ich will es in einem Atmel Microcontroller verwenden. Vielleicht hat ja
schon jemand einen Quelltext.
Ist zwar OT, aber es gibt mir Gelegenheit für meine seit zwei Jahren
nicht mehr aktualisierte Homepage Werbung zu machen:

http://www.seegerer.gmxhome.de/tage.htm

Da gibts keinen Quelltext, man kann die Methode aber leicht
implementieren. Evtl. sollte man die Rechenschritte noch für
den Controller anpassen, z.B. geht das durch 28 dividieren
und den Rest bestimmen auch ohne die Tabelle mit den
Jahreszahlen.

Bis die Tage
Georg
 
WICHTIG:

Der Modulo-Operator funktioniert in vielen Programmiersprachen nicht
richtig, sondern liefert einfach nur den Restwert.
Berechnet wird der Tag nach der Gauß'schen Kalenderformel.
Ausführliche Informationen:
http://www1.computerwoche.de/heftarchiv/1997/19971031/a36854.html

Gruß,
Nico
 
weiß jemand wie man den Wochentag von einem Datm berechnet?
In http://www.embeddedFORTH.de Heft 1 Seite 7 "UNIX-Zeit"
habe ich Algorithmus verwendet den ich mal in Funkschau fand.
Kann Orginal scannen. Es gibt glaube ich in Literatur mehrere
Varianten, der war der der mir am einfachsten schien.
Speziell für Kalenderberechnungen auf Controller sei
Festkomma statt Float wärmstens empfohlen.

MfG JRD
 
Georg Seegerer wrote:

weiß jemand wie man den Wochentag von einem Datm berechnet?
Ich will es in einem Atmel Microcontroller verwenden. Vielleicht hat ja
schon jemand einen Quelltext.

Ist zwar OT, aber es gibt mir Gelegenheit für meine seit zwei Jahren
nicht mehr aktualisierte Homepage Werbung zu machen:

http://www.seegerer.gmxhome.de/tage.htm
Ich staune immer wieder, womit man sich so alles beschäftigen kann. Wie oft
brauchst Du diese Fähigkeit?

;o)
Sebastian
 
Danke,

werde mal schauen ob ich es hinbekomme.

MfG Alex
 
"Alex Loipführer" <Loipe@t-online.de> wrote in
news:blutfv$8gt$04$1@news.t-online.com:

uchar GetDayOfWeek( uint date )
{
uint month,year;
int century, yr, dw;

month = GetMonth( date );
year = GetYear( date );
if (year<80)
year+=2000;
else
year+=1900;
if(month < 3)
{
month += 10;
--year;
}
else
month -= 2;

century = year / 100;
yr = year % 100;
dw = (((26 * (int)month - 2) / 10) + (int)GetDay(date) + yr + (yr /
4) + (century / 4) - (2 * century)) % 7;

if(dw < 0)
dw += 7;

return((uchar)dw & 0x07);
}

M.

--
Bitte auf mwnews2@pentax.boerde.de antworten.
 
"Alex Loipführer" schrieb:
weiß jemand wie man den Wochentag von einem Datm berechnet?
Aus den Weiten des Netzes und nicht von mir, aber es funktioniert:


int 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;
}
 
int dayofweek(int y, int m, int d) /* 0 = Sonntag */
Funktioniert NICHT in den meisten Programmiersprachen! Siehe mein obiges
Posting und den entsprechenden Link. Der einfache Modulo-Operator sorgt zum
Beispiel beim 1. März 2000 für ein falsches Ergebnis, weil die Formel auch
negative Werte als Ergebnis aufweisen kann. Aber nicht nur an dem Tag,
sondern bei vielen Tagen konsequenterweise. Wird im Artikel als
"Jahr2000"-Problem der Formel bezeichnet, welches aber bei guten Compilern
nicht auftritt, da diese die Modulo-Funktion richtig mit a mod b = a - (b .
int(a / b)) implementiert haben.
Nico
 
Alex Loipführer <Loipe@t-online.de> wrote:

weiß jemand wie man den Wochentag von einem Datm berechnet?
Such mal in den Quellen der Unixe. Für FreeBSD kann ich Dir

http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdtime/localtime.c

empfehlen, eventuell auch noch eine der anderen Dateien in diesem
Verzeichnis (habe ich mir so genau jetzt nicht angesehen).
--
J"org Wunsch Unix support engineer
joerg_wunsch@interface-systems.de http://www.interface-systems.de/~j/
 
Nicolas Mittelmaier wrote:

int dayofweek(int y, int m, int d) /* 0 = Sonntag */

Funktioniert NICHT in den meisten Programmiersprachen! Siehe mein obiges
Posting und den entsprechenden Link. Der einfache Modulo-Operator sorgt
zum Beispiel beim 1. März 2000 für ein falsches Ergebnis, weil die
Formel auch negative Werte als Ergebnis aufweisen kann.
Bitte um Erklaerung, wie die von Rene gepostete Formel negative Werte
produzieren sollte (unter der Voraussetzung, dass man nur positive
Jahreszahlen einsetzt, was aber keine Einschraenkung ist, da die Formel
ohnehin nur fuer fuer den gregorianischen Kalender, also ab 1582, richtige
Ergebnisse liefert).

--
Gruesse,
Pascal Le Bail, Wien
Meine Absenderadresse ist derzeit inaktiv. Siehe <http://swen.pascal.at/>.
 
weiß jemand wie man den Wochentag von einem Datm berechnet?

Ich staune immer wieder, womit man sich so alles beschäftigen kann. Wie oft
brauchst Du diese Fähigkeit?
Nützlich ist es natürlich zu nichts, ist auf Parties aber hin und
wieder ein guter Gag.

Georg
 
"Georg Seegerer" <nospam@nospam.nospam> schrieb:

Da gibts keinen Quelltext, man kann die Methode aber leicht
implementieren.
Warum funktioniert die Methode nicht für 1900 oder 2100?

Christian
 
"Nicolas Mittelmaier" <scooby_doo766@yahoo.de> schrieb:

Der Modulo-Operator funktioniert in vielen Programmiersprachen nicht
richtig, sondern liefert einfach nur den Restwert.
Hm. Ich dachte immer, der Modulo-Operator _soll_ mir den Restwert liefern.
Also meinetwegen

9 mod 8 = 1,
10 mod 3 = 1,
20 mod 4 = 0,
18 mod 5 = 3, usw.

also

a mod b = a - b * ganzzahl( a / b ),

wobei ganzzahl(a) den Nachkommaanteil des Argumentes abschneidet.

Das hat es bisher bei mir immer getan, und ich benutze den modulo-Operator
nicht wirklich selten und mit verschiedensten Implementierungen
unterschiedlichster Programmiersprachen.

Außerdem hängt wohl von der _Implementierung_ der Programmiersprache ab, wie
das Ding nun genau funktioniert.

Oder bin ich auf dem völlig flaschen Dampfer?

Christian
 
Der Modulo-Operator funktioniert in vielen Programmiersprachen nicht
richtig, sondern liefert einfach nur den Restwert.

Hm. Ich dachte immer, der Modulo-Operator _soll_ mir den Restwert liefern.
Also meinetwegen

9 mod 8 = 1,
10 mod 3 = 1,
20 mod 4 = 0,
18 mod 5 = 3, usw.
Probleme gibts ja auch immer nur bei negativen Zahlen, da waren sich
Mathematiker und Programierer nicht einig wie's denn definiert sein
soll. Da mann den Modulo bei neg. Zahlen selten benutzt ist es auch
ziemlich lang nicht aufgefallen.

Georg
 
Warum funktioniert die Methode nicht für 1900 oder 2100?
Weil die Formel davon ausgeht dass alle 4 Jahre ein Schaltjahr ist.
Bei ganzen Jahrhundert-Jahren ist das normalerweise nicht der Fall,
2000 ist da eine Ausnahme. Wenn man es über die Jahre 1901 bis
2099 ausdehnen will braucht man eine extra Tabelle mit Jahreszahlen
(zum modulo 28-Bilden) für jedes Jahrhundert.
20. und 21.Jh gingen in einem Stück da in dem Bereich kein Schaltjahr
ausfällt.

Georg
 
int dayofweek(int y, int m, int d) /* 0 = Sonntag */
Bitte um Erklaerung, wie die von Rene gepostete Formel negative Werte
produzieren sollte
Diese Formel kann keine negativen Werte produzieren, da das Array static int
t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4} bereits alle möglichen
Modulo7-Werte liefert. Diese Formel ist jedoch nicht für wirklich alle (!)
Daten anwendbar. Insbesondere das 1. März 2000-Problem wird in dem von mir
oben geposteten Artikel beschrieben.

Meine Erklärung mit den negativen Werten bezog sich daher auf die wirklich
anzuwendende Formel, wie sie im Artikel beschrieben wird. Dort können
negative Werte auftreten, und diese können in vielen Programmiersprachen
falsche Modulo-Werte liefern.Wie Georg in seinem Posting vom 8.Okt 09:14
bereits schreibt, waren sich Mathematiker und Programmierer bei der
Definition des Modulo-Operators bei negativen Werten nicht einig.

Gruss,
Nico
 
"Georg Seegerer" <nospam@nospam.nospam> schrieb:

Weil die Formel davon ausgeht dass alle 4 Jahre ein Schaltjahr ist.
Mööp. Klar. Hätte ich auch drauf kommen können.

Gruß,

Christian
 
"Georg Seegerer" <nospam@nospam.nospam> schrieb:

Da mann den Modulo bei neg. Zahlen selten benutzt ist es auch
ziemlich lang nicht aufgefallen.
Ich dachte immer, Mathematiker kümmern sich eher weniger um die Praxis?

Gruß,

Christian
 
Da mann den Modulo bei neg. Zahlen selten benutzt ist es auch
ziemlich lang nicht aufgefallen.

Ich dachte immer, Mathematiker kümmern sich eher weniger um die Praxis?
Das ist dann wohl ein weiterer Grund warum es eine Weile nicht
aufgefallen ist. Jetzt möchte man es wohl nicht mehr ändern
weil es dann nur noch mehr Verwirrung gibt, v.a. wenn jemand
einen alten Quellcode compilieren will.

Bis die Tage
Georg
 

Welcome to EDABoard.com

Sponsor

Back
Top