ライブラリ/モジュールなしでエポック秒(NTPエポック1900-01-01 00:00以降)から日時文字列(MM / DD / YY、hh:mm:ss)に変換するための最良の方法を見つけようとしています/組み込みデバイスでは使用できないため、外部機能。
私が最初に考えたのは、Pythonのdatetimeモジュールのソースコードを調べることでしたが、それは私にはあまり役に立ちませんでした。
Pythonでの最初の試みでは、0001-01-01から現在までの日数をC ++ソースgetDateFromJulianDay
からPythonに適合させて変換し、モジュロ演算と組み合わせて時間を取得します。それは機能しますが、より良い方法はありますか?
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機能を実装する予定です。時間同期方法の説明は、この質問など、他の場所に残すのが最適です。
ノート:
- 私の組み込みデバイスは、Python1.5.2+を実行するTelitGC-864セルラーモデムであり、限られた演算子(ほとんどはC演算子のみ)のみを備え、モジュールはなく、予想される組み込みPythonタイプの一部を備えています。興味があれば、正確な機能はここにあります。私はこのデバイス用にCコードを書いているかのようにPythonを書いていますが、Pythonicではありません。
- NTPは時間オフセットにのみ使用するのが最適ですが、オプションが限られているため、絶対時間ソースとしてNTPを使用しています(2036年にNTPロールオーバーのチェックを追加して、さらに136年間の運用を可能にすることができます)。
- 最新のファームウェアを搭載したGC-864-V2デバイスにはNTP機能がありますが、使用する必要のあるGC-864は以前のリリースのファームウェアのままです。