[PYTHON] Gegenseitige Umrechnung zwischen Datum und Tag seit dem 1. Januar 2000

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

Gegenseitige Umrechnung zwischen Datum und Tag seit dem 1. Januar 2000
Gegenseitige Konvertierung zwischen Qiita-Artikel und Jupyter-Notizbuch
Umrechnung zwischen Julius-Tag und Gregorius-Kalenderdatum
Festkomma- und Binärkonvertierung
Gegenseitige Konvertierung zwischen JSON und YAML / TOML in Python
Konvertierung zwischen Unixtime und Datetime
Umwandlung zwischen Singular- und Pluralwörtern
Beziehung zwischen Firestore- und Go-Datentypkonvertierung
[Python] Konvertierungsnotiz zwischen Zeitdaten und numerischen Daten