Tôi đang cố gắng tìm ra cách tốt nhất để chuyển đổi từ giây epoch (kể từ thời điểm NTP 1900-01-01 00:00) thành chuỗi ngày giờ (MM/DD/YY) , hh: mm: ss) không có bất kỳ thư viện/mô-đun/chức năng bên ngoài nào vì chúng không khả dụng trên thiết bị được nhúng.Chuyển đổi từ giây sang ngày trên thiết bị nhúng bị giới hạn
Suy nghĩ đầu tiên của tôi là xem Python datetime module source code, tuy nhiên điều đó không hữu ích đối với tôi.
Nỗ lực ban đầu của tôi bằng Python sử dụng chuyển đổi ngày kể từ 0001-01-01 cho đến ngày sử dụng getDateFromJulianDay
được điều chỉnh cho Python từ C++ source, kết hợp với các hoạt động modulo để có thời gian. Nó hoạt động, nhưng có cách nào tốt hơn không?
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
Tại sao tôi đang làm điều này: Tôi nhận được thời gian hiện tại từ một máy chủ NTP, và dành thời gian này theo mệnh giá cho việc cập nhật một đồng hồ phần cứng thời gian thực (RTC) mà chỉ chấp nhận ngày, múi giờ và thời gian: MM/DD/YY, hh: mm: ss, ± zz. Tôi dự định triển khai các khả năng NTP thực sự vào một ngày sau đó. Thảo luận về các phương pháp đồng bộ hóa thời gian tốt nhất còn lại ở nơi khác, chẳng hạn như this question.
Ghi chú:
- thiết bị nhúng của tôi là một Telit GC-864 modem di động chạy Python 1.5.2+ và chỉ có giới hạn khai thác (chủ yếu chỉ khai thác C), không có mô-đun, và một số các dự kiến được xây dựng trong các loại Python. Các khả năng chính xác là here, nếu bạn quan tâm. Tôi viết Python cho thiết bị này như thể tôi đang viết mã C - không phải là rất Pythonic, tôi biết.
- Tôi nhận thấy NTP chỉ được sử dụng tốt nhất để bù đắp thời gian, tuy nhiên với các tùy chọn giới hạn, tôi sử dụng NTP làm nguồn thời gian tuyệt đối (tôi có thể thêm séc để chuyển khoản NTP vào năm 2036 để kích hoạt 136 năm hoạt động khác) .
- Thiết bị GC-864-V2 với phần mềm cập nhật không có khả năng NTP, nhưng GC-864 tôi cần sử dụng bị kẹt trên bản phát hành chương trình cơ sở trước đó.
Tại sao bạn bận tâm xử lý các ngày trước 1582? –
Có, không cần thiết - được bao gồm trong mã gốc, quên bao gồm nguồn C++ của hàm getDateFromJulianDay, [dòng 132 tại đây] (http://qt.gitorious.org/qt/qt/blobs/4.7/src/ corelib/tools/qdatetime.cpp # line132). – swolpert
Vì vậy, hãy xóa nó khỏi mã đã đăng của bạn và làm cho câu hỏi của bạn rõ ràng hơn. – dkamins