Próbuję znaleźć najlepszy sposób konwersji z epok sekund (od epoki NTP 1900-01-01 00:00) do ciągu datetime (MM/DD/RR , hh: mm: ss) bez żadnych bibliotek/modułów/funkcji zewnętrznych, ponieważ nie są one dostępne w urządzeniu osadzonym.Epoka od czasu do daty na ograniczonym osadzonym urządzeniu
Moją pierwszą myślą było przyjrzeć się Python datetime module source code, ale nie było to dla mnie zbyt przydatne.
Moja początkowa próba w Pythonie używa konwersji dni od 0001-01-01 do daty przy użyciu getDateFromJulianDay
dostosowanej do Pythona z C++ source, w połączeniu z operacjami modulo w celu uzyskania czasu. Działa, ale czy istnieje lepszy sposób?
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
Dlaczego to robię: otrzymuję aktualny czas z serwera NTP, biorąc tym razem w wartości nominalnej do aktualizacji sprzętu zegar czasu rzeczywistego (RTC), który akceptuje tylko datę, strefa czasowa i czasowa: MM/DD/RR, gg: mm: ss, ± zz. Mam zamiar wdrożyć prawdziwe możliwości NTP w późniejszym terminie. Omówienie metod synchronizacji czasu najlepiej pozostawić w innym miejscu, na przykład this question.
Uwagi:
- Moje urządzenie jest wbudowany Telit GC-864 modem komórkowy, który uruchamia Python 1.5.2+ a jedynie ograniczył operatorów (przeważnie właśnie podmiotów C), brak modułów, a niektóre z oczekiwaną wbudowane typy Pythona. Dokładne możliwości to here, jeśli jesteś zainteresowany. Piszę dla tego urządzenia Pythona, tak jakbym pisał kod C - nie bardzo Pythonic, wiem.
- Zdaję sobie sprawę, że NTP najlepiej używać tylko do przesunięcia czasu, jednak z ograniczonymi opcjami, używam NTP jako bezwzględnego źródła czasu (mogę dodać czek na rollover NTP w 2036, aby umożliwić kolejne 136 lat działania) .
- Urządzenie GC-864-V2 z aktualnym oprogramowaniem sprzętowym ma funkcję NTP, ale GC-864, którego potrzebuję, utknął w poprzedniej wersji oprogramowania układowego.
Dlaczego nie radzisz sobie z datami przed 1582? –
Tak, niepotrzebne - zostało zawarte w oryginalnym kodzie, zapomniałem dodać źródła C++ funkcji getDateFromJulianDay, [linia 132 tutaj] (http://qt.gitorious.org/qt/qt/blobs/4.7/src/ corelib/tools/qdatetime.cpp # line132). – swolpert
Więc usuń go z opublikowanego kodu i wyraź swoje pytanie. – dkamins