Я пытаюсь найти лучший способ преобразования секунд эпохи (начиная с эпохи NTP 1900-01-01 00:00) в строку даты и времени (ММ/ДД/ГГ, чч: мм: сс) без каких-либо библиотек/модулей/ внешние функции, так как они недоступны на встроенном устройстве.
Моей первой мыслью было взглянуть на исходный код модуля Python datetime Однако мне это не очень помогло.
Моя первая попытка в Python использует преобразование дней с 01-01-0001 до настоящего времени с использованием getDateFromJulianDay
, адаптированного для Python из исходник C++ в сочетании с операциями по модулю для получения времени. Это работает, но есть ли лучший способ?
def getDateFromJulianDay(julianDay):
# Gregorian calendar starting from October 15, 1582
# This algorithm is from:
# Henry F. Fliegel and Thomas C. van Flandern. 1968.
# Letters to the editor:
# a machine algorithm for processing calendar dates.
# Commun. ACM 11, 10 (October 1968), 657-. DOI=10.1145/364096.364097
# http://doi.acm.org/10.1145/364096.364097
ell = julianDay + 68569;
n = (4 * ell) / 146097;
ell = ell - (146097 * n + 3) / 4;
i = (4000 * (ell + 1)) / 1461001;
ell = ell - (1461 * i) / 4 + 31;
j = (80 * ell) / 2447;
d = ell - (2447 * j) / 80;
ell = j / 11;
m = j + 2 - (12 * ell);
y = 100 * (n - 49) + i + ell;
return y,m,d
# NTP response (integer portion) for Monday, March 25, 2013 at 6:40:43 PM
sec_since_1900 = 3573225643
# 2415021 is the number of days between 0001-01-01 and 1900-01-01,
# the start of the NTP epoch
(year,month,day) = getDateFromJulianDay(2415021 + sec_since_1900/60/60/24)
seconds_into_day = sec_since_1900 % 86400
(hour, sec_past_hour) = divmod(seconds_into_day,3600)
(min, sec) = divmod(sec_past_hour,60)
print 'year:',year,'month:',month,'day:',day
print 'hour:',hour,'min:',min,'sec:',sec
Почему я это делаю: я получаю текущее время с NTP-сервера и принимаю это время за чистую монету для обновления аппаратных часов реального времени (RTC), которые принимают только дату, время и часовой пояс: MM/DD/ ГГ, чч: мм: сс, ± zz. Я планирую реализовать настоящие возможности NTP позднее. Обсуждение методов синхронизации времени лучше оставить в другом месте, например этот вопрос.
Примечания:
- Мое встроенное устройство представляет собой сотовый модем Telit GC-864, который работает под управлением Python 1.5.2+ и имеет только ограниченное количество операторов (в основном только операторы C), без модулей и с некоторыми ожидаемыми встроенными типами Python. Точные возможности можно найти здесь, если вам интересно. Я пишу Python для этого устройства, как будто я пишу код C — не очень Pythonic, я знаю.
- Я понимаю, что NTP лучше всего использовать только для смещения по времени, однако с ограниченными возможностями я использую NTP в качестве источника абсолютного времени (я мог бы добавить проверку для обновления NTP в 2036 году, чтобы обеспечить еще 136 лет работы).
- Устройство GC-864-V2 с последней версией прошивки поддерживает NTP, но GC-864, который мне нужно использовать, застрял на предыдущей версии прошивки.