我想知道從紀元時間(自NTP時代1900-01-01 00:00)轉換爲日期時間字符串(MM/DD/YY ,hh:mm:ss)沒有任何庫/模塊/外部函數,因爲它們在嵌入式設備上不可用。Epoch在有限嵌入式設備上進行秒轉換
我的第一個想法是看Python datetime module source code,但是這對我來說並不是很有用。
我在Python中的初始嘗試使用自0001-01-01以來的天數轉換,使用getDateFromJulianDay
適應Python的C++ source,並結合模運算獲取時間。它有效,但有沒有更好的方法?
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/YY,hh:mm:ss,±zz。我計劃在以後實施真正的NTP功能。時間同步方法的討論最好留在其他地方,如this question。
注:
- 我的嵌入式設備是運行的Python 1.5.2+並且只有泰利特GC-864蜂窩式調制解調器具有有限的運營商(大多隻是C運算符),沒有模塊,和一些預期的內置的Python類型。如果您有興趣,確切的功能是here。我爲這個設備編寫Python,好像我正在編寫C代碼 - 我知道不是Pythonic。
- 我意識到NTP最好只用於時間偏移,但是有限的選擇,我使用NTP作爲絕對時間源(我可以在2036年添加NTP翻轉檢查以啓用另一個136年的操作) 。
- 具有最新固件的GC-864-V2設備具有NTP功能,但我需要使用的GC-864卡住了以前的固件版本。
你爲什麼在1582年之前打擾日期呢? – 2013-03-26 00:48:49
是的,沒有必要 - 被包含在原始代碼中,忘記包含getDateFromJulianDay函數的C++源代碼,[line 132 here](http://qt.gitorious.org/qt/qt/blobs/4.7/src/ corelib的/工具/ qdatetime.cpp#line132)。 – swolpert 2013-03-26 00:59:02
然後將其從您的發佈代碼中刪除,並讓您的問題更清晰。 – dkamins 2013-03-26 21:38:21