[PYTHON] Conversion mutuelle entre la date et les jours écoulés depuis le 1er janvier 2000

Bien qu'il s'agisse de code Python, c'est un programme de vérification de la logique de calcul de la date. La logique elle-même est utilisée pour l'implémentation en langage C, qui est un environnement autonome. Peut-être que Python a une bibliothèque de date et d'heure décente, donc vous n'en avez pas besoin.

Étant donné que la représentation interne de l'horloge en temps réel (RTC) du MCU intégré ou d'un seul appareil est généralement au format BCD basé sur le 1er janvier 2000, il est difficile de calculer la différence entre les dates si elle est exprimée telle quelle.

Ce sera plus facile si vous convertissez la date lue à partir du RTC en nombre de jours écoulés en fonction du 1er janvier 2000, puis effectuez le calcul. Étant donné que l'heure actuelle du RTC et les paramètres tels que les alarmes sont au format BCD, nous avons également mis en œuvre une conversion pour revenir à la date.

Remarques

calendar.py


__author__ = '[email protected]'
__version__ = '0.1'

#J'ai fait référence à l'article à l'URL suivante.
# Going My C Way:Trouvez le nombre de jours écoulés depuis le 1er janvier 2000
# https://cprogramming.g.hatena.ne.jp/lnznt/20110721/1311244811

#Fonction de jugement d'année en année
def is_leapyear(year):
    return ((year % 4) == 0) and ((year % 100) != 0) or ((year % 400) == 0)

#Année/Calculez le dernier jour du mois.
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]

#Jours écoulés mensuellement à partir du 1er janvier de l'année
days_tbl = (
    #janvier,février,Mars, ...décembre
    0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, #année bissextile
    366, 397, 425, 456, 486, 517, 547, 578, 609, 639, 670, 700, #année bissextile+1
    731, 762, 790, 821, 851, 882, 912, 943, 974, 1004, 1035, 1065, #année bissextile+2
    1096, 1127, 1155, 1186, 1216, 1247, 1277, 1308, 1339, 1369, 1400, 1430, #année bissextile+3
    1461)

#À partir du nombre de jours écoulés depuis le 1er janvier 2000(yyyy, mm, dd)Calculer.
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)Calculez le nombre de jours écoulés depuis.
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

Conversion mutuelle entre la date et les jours écoulés depuis le 1er janvier 2000
Conversion mutuelle entre l'article Qiita et le notebook Jupyter
Conversion entre le jour Julius et la date du calendrier Gregorius
Conversion en virgule fixe et binaire
Conversion mutuelle entre JSON et YAML / TOML en Python
Conversion entre unixtime et datetime
Conversion entre mots singuliers et pluriels
Relation entre la conversion des types de données Firestore et Go
[Python] Mémo de conversion entre les données temporelles et les données numériques