Если вы можете справиться с точностью до двух секунд, формат метки времени MS-DOS использовал 16 бит для хранения даты (год-1980 как 7 бит, месяц как 4, день как 5) и 16 бит для времени (часпять минут шесть как пять секунд.На процессоре, таком как Arduino, может быть возможно написать код, который разделяет значения через 16-битную границу, но я думаю, что код будет более эффективным, если вы сможете избежать такого разделения (как MS-DOS сделал, приняв двухсекундныйточность).
В противном случае, как было отмечено в другом ответе, использование 32-разрядного числа секунд, поскольку некоторое базовое время часто будет более эффективным, чем попытка отслеживать вещи в «формате календаря».Если все, что вам когда-либо нужно, - это переходить от одной даты в календарном формате к следующей, сделать код может быть проще, чем код для преобразования между календарными датами и линейными датами, но если вам нужно сделать что-то еще (дажешаг назад от даты к предыдущей) вам, вероятно, будет лучше конвертировать даты в / из линейного формата, когда они вводятся или отображаются, а в остальном просто работать с линейными числами секунд.
Работа слинейные числа секунд можно сделать более удобными, если вы выберете в качестве базовой даты 1 марта високосного года.Затем, хотя дата превышает 1461, вычтите ее из даты и добавьте 4 к году (16-битное сравнение и вычитание эффективны на Arduino, и даже в 2040 году цикл все равно может занять меньше времени, чем одно деление 16x16).Если дата превышает 364, вычтите 365 и увеличьте год, и попробуйте сделать это в два раза больше [если дата - 365 после третьего вычитания, оставьте ее].
Требуется некоторая осторожность, чтобы все углыслучаи работают правильно, но даже на небольшом 8-битном или 16-битном микро преобразовании могут быть удивительно эффективными.