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