Obwohl es sich um Python-Code handelt, handelt es sich um ein Programm zur Überprüfung der Datumsberechnungslogik. Die Logik selbst wird für die Implementierung in der C-Sprache verwendet, die eine freistehende Umgebung ist. Vielleicht hat Python eine anständige Datums- und Zeitbibliothek, sodass Sie diese nicht benötigen.
Da die interne Darstellung der Echtzeituhr (RTC) der eingebauten MCU oder eines einzelnen Geräts normalerweise im BCD-Format basierend auf dem 1. Januar 2000 vorliegt, ist es schwierig, die Differenz zwischen Daten zu berechnen, wenn sie so ausgedrückt wird, wie sie ist.
Es ist einfacher, wenn Sie das aus der RTC gelesene Datum in die Anzahl der Tage konvertieren, die basierend auf dem 1. Januar 2000 vergangen sind, und dann die Berechnung durchführen. Da die aktuelle Uhrzeit der RTC und Einstellungen wie Alarme im BCD-Format vorliegen, haben wir auch die Konvertierung implementiert, um zum Datum zurückzukehren.
Bemerkungen
calendar.py
__author__ = '[email protected]'
__version__ = '0.1'
#Ich habe auf den Artikel unter der folgenden URL verwiesen.
# Going My C Way:Finden Sie die Anzahl der Tage, die seit dem 1. Januar 2000 vergangen sind
# https://cprogramming.g.hatena.ne.jp/lnznt/20110721/1311244811
#Urteilsfunktion von Jahr zu Jahr
def is_leapyear(year):
return ((year % 4) == 0) and ((year % 100) != 0) or ((year % 400) == 0)
#Jahr/Berechnen Sie den letzten Tag des Monats.
def last_day_of_month(year, month):
if ((month == 2) and is_leapyear(year)):
return 29
return (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[month]
#Monatlich verstrichene Tage ab dem 1. Januar des Jahres
days_tbl = (
#Januar,Februar,März, ...Dezember
0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, #Schaltjahr
366, 397, 425, 456, 486, 517, 547, 578, 609, 639, 670, 700, #Schaltjahr+1
731, 762, 790, 821, 851, 882, 912, 943, 974, 1004, 1035, 1065, #Schaltjahr+2
1096, 1127, 1155, 1186, 1216, 1247, 1277, 1308, 1339, 1369, 1400, 1430, #Schaltjahr+3
1461)
#Aus der Anzahl der seit dem 1. Januar 2000 verstrichenen Tage(yyyy, mm, dd)Berechnen.
def to_date(elapsed_days):
y4 = int(elapsed_days / (1 + (365 * 4)))
d0 = elapsed_days % (1 + (365 * 4))
m0 = int(d0 / 30)
m1 = m0 - (1 if (d0 < days_tbl[m0]) else 0)
year = 2000 + (y4 * 4) + int(m1 / 12)
month = (m1 % 12) + 1
day = (d0 - days_tbl[m1]) + 1
return (year, month, day)
# (yyyy, mm, dd)Berechnen Sie die Anzahl der verstrichenen Tage.
def calc_elapsed_days(date):
y = int((date[0] - 2000) / 4)
m = ((date[0] - 2000) % 4) * 12 + date[1] - 1
d = date[2] - 1
return ((y * (1 + 365 * 4)) + days_tbl[m] + d)
def check_days(date, days):
cdays = calc_elapsed_days(date)
result = 'OK' if (cdays == days) else 'NG'
print("{0} is {1}. calc={2}, correct={3}".format(date, result, cdays, days));
def check_ymd(days, date):
calc_date = to_date(days)
result = 'OK' if (calc_date[0] == date[0] and calc_date[1] == date[1] and calc_date[2] == date[2]) else'NG'
print("{0} is {1}. calc={2}, correct={3}".format(days, result, calc_date, date));
def main():
print('(yyyy,mm,dd) to elapsed days')
check_days((2000, 1, 1), 0)
check_days((2000, 12, 31), 365)
check_days((2001, 1, 1), 366)
check_days((2001, 12, 31), 730)
check_days((2002, 1, 1), 731)
check_days((2050, 12, 31), 18627)
check_days((2098, 12, 31), 36159)
check_days((2099, 1, 1), 36160)
check_days((2099, 11, 30), 36493)
check_days((2099, 12, 1), 36494)
check_days((2099, 12, 31), 36524)
print('elapsed days to (yyyy,mm,dd)')
check_ymd(0, (2000, 1, 1))
check_ymd(365, (2000, 12, 31))
check_ymd(366, (2001, 1, 1))
check_ymd(730, (2001, 12, 31))
check_ymd(731, (2002, 1, 1))
check_ymd(18627, (2050, 12, 31))
check_ymd(36159, (2098, 12, 31))
check_ymd(36160, (2099, 1, 1))
check_ymd(36493, (2099, 11, 30))
check_ymd(36494, (2099, 12, 1))
check_ymd(36524, (2099, 12, 31))
if __name__ == '__main__':
main()
Recommended Posts