diff options
Diffstat (limited to 'watch-library/watch')
-rw-r--r-- | watch-library/watch/watch_utility.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/watch-library/watch/watch_utility.c b/watch-library/watch/watch_utility.c index 0e95d4dc..df808404 100644 --- a/watch-library/watch/watch_utility.c +++ b/watch-library/watch/watch_utility.c @@ -36,8 +36,34 @@ const char * watch_utility_get_weekday(watch_date_time date_time) { } uint32_t watch_utility_convert_to_unix_time(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t utc_offset) { - // TODO - return 0; + uint16_t DAYS_SO_FAR[] = { + 0, // Jan + 31, // Feb + 59, // March + 90, // April + 120, // May + 151, // June + 181, // July + 212, // August + 243, // September + 273, // October + 304, // November + 334 // December + }; + + + uint32_t year_adj = year + 4800; + uint32_t febs = year_adj - (month <= 2 ? 1 : 0); /* Februaries since base. */ + uint32_t leap_days = 1 + (febs / 4) - (febs / 100) + (febs / 400); + uint32_t days = 365 * year_adj + leap_days + DAYS_SO_FAR[month - 1] + day - 1; + days -= 2472692; /* Adjust to Unix epoch. */ + + uint32_t timestamp = days * 86400; + timestamp += (hour + utc_offset) * 3600; + timestamp += minute * 60; + timestamp += second; + + return timestamp; } uint32_t watch_utility_date_time_to_unix_time(watch_date_time date_time, uint32_t utc_offset) { |