Wie berechnet man den Wochentag für RTC?


7

Ich verwende MCP7940 RTC von Microchip. Es ist erforderlich, den Wochentag einzugeben, um RTC mit dem Datum zu aktualisieren. Wie soll ich den Wochentag anhand des vom Benutzer angegebenen Datums berechnen?

Antworten:


8

Wenn Sie den Wochentag selbst berechnen möchten, finden Sie hier eine C-Implementierung eines Teils eines Perl-Moduls, das ich vor etwa 20 Jahren geschrieben habe. Ich mag diesen Algorithmus, weil er keine Schleife oder eine Tabelle mit Monatslängen erfordert. Beachten Sie, dass ints als 32 Bit angenommen wird.

/* Returns the number of days to the start of the specified year, taking leap
 * years into account, but not the shift from the Julian calendar to the
 * Gregorian calendar. Instead, it is as though the Gregorian calendar is
 * extrapolated back in time to a hypothetical "year zero".
 */
int leap (int year)
{
  return year*365 + (year/4) - (year/100) + (year/400);
}

/* Returns a number representing the number of days since March 1 in the
 * hypothetical year 0, not counting the change from the Julian calendar
 * to the Gregorian calendar that occured in the 16th century. This
 * algorithm is loosely based on a function known as "Zeller's Congruence".
 * This number MOD 7 gives the day of week, where 0 = Monday and 6 = Sunday.
 */
int zeller (int year, int month, int day)
{
  year += ((month+9)/12) - 1;
  month = (month+9) % 12;
  return leap (year) + month*30 + ((6*month+5)/10) + day + 1;
}

/* Returns the day of week (1=Monday, 7=Sunday) for a given date.
 */
int dow (int year, int month, int day)
{
  return (zeller (year, month, day) % 7) + 1;
}

Eine Tabelle mit der Anzahl der Tage vom 1. März bis zum ersten Tag eines bestimmten Monats wäre wahrscheinlich kleiner und schneller als der Code zur Bewertung der angegebenen Formel, insbesondere wenn man nur an Daten im Bereich 2000-2099 interessiert ist.
Supercat

@supercat: Warum zeigst du uns nicht, wie dieser Code aussehen würde?
Dave Tweed

3

Gemäß dem Datenblatt unter der Adresse 0x03 in Tabelle 4-1 gibt es ein Feld 'Tag'. Am Ende der Zeile befindet sich eine kurze Beschreibung:

AddressBit7:3Bit2:0FunctionRange0x03...DayDay1-7

Dies bedeutet, dass der Tag auf eine beliebige Zahl zwischen 1 und 7 eingestellt werden kann. Sie können Ihre eigene Konvention auswählen, welcher Wochentag ist. Auf POSIX-Systemen ist Montag als 1 definiert, ich denke, das ist ein guter Standard. Dann Dienstag = 2; Mittwoch = 3; ...

Tag = 0 ist nicht dokumentiert, verwenden Sie es also nicht.

Unter Linux kann diese Nummer leicht mit dem Befehl gefunden werden date +%u, der heute antwortet, 6da es Samstag ist. Wenn Sie diese lokal auf Ihrem PIC berechnen möchten, müssen Sie die C-Bibliothek , dass Geräte die Formel finden müssen, glaube ich, strftimein <time.h>genau das tut, aber ich bin nicht genug C - Programmierer zu erklären , wie diese bestimmte Bibliothek zu verwenden. Da es sich um eine häufig verwendete Bibliothek handelt, ist die Dokumentation leicht zu finden.


Montag ist auch Tag 1 (Sonntag Tag 7) in der internationalen Norm ISO-8601.
Joris Groosman

0

Wochentag ist beliebig . Sie definieren es. Sie können den Julianischen Sonntag = Tag 1 verwenden. Sie können den Montag als Tag 1 verwenden, da der Sonntag der 7. Tag ist. Sie können Freitag als Tag 1 verwenden, da dies der erste Tag des Wochenendes ist. Sie könnten Dienstag als Tag 1 verwenden, weil Sie Montag hassen.


2
Dies ist keine Antwort. Es scheint eine Art Scherz zu sein, aber ich kann nicht herausfinden, worum es geht. Die ursprüngliche Frage war, wie man von einem bestimmten Datum zum richtigen Wochentag kommt.
Dave Tweed

@ DaveTweed Ich erkläre, dass der Wochentag willkürlich ist. Es hat keine feste Bedeutung für die RTC. Bis OP definiert, was er für Tag 1 hält, ist es unmöglich, den "richtigen Wochentag" zu erhalten, wie Sie es ausdrücken.
Passant

Wenn Sie der Meinung sind, dass die Frage unvollständig war, sollte dies als Kommentar und nicht als Antwort veröffentlicht werden.
Dave Tweed

Die Tatsache, dass es willkürlich ist, bedeutet nicht, dass es nicht berechnet werden kann, sobald Sie Ihren Standard festgelegt haben.
Joris Groosman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.