2010-03-25 41 views
15

Tôi đã tìm kiếm khắp nơi trên net và không thể tìm thấy một giải pháp thích hợp cho vấn đề nàyPython | mktime lỗi tràn

OverflowError: mktime argument out of range 

Mã gây ra ngoại lệ này

t = (1956, 3, 2, 0, 0, 0, 0, 0, 0) 
ser = time.mktime(t) 

Tôi muốn biết lý do thực sự cho ngoại lệ này, một số nói rằng ngày không nằm trong phạm vi hợp lệ nhưng nó không có ý nghĩa gì đối với tôi và nếu có phạm vi thì nó có thể là gì. Là nó phụ thuộc vào hệ thống mà chúng tôi đang sử dụng. Cũng muốn biết một giải pháp tốt cho vấn đề này.

Cảm ơn.

Trả lời

19

time.mktime gọi hàm cơ bản mktime từ thư viện C của nền tảng. Ví dụ, mã trên mà bạn đã đăng hoạt động hoàn toàn tốt cho tôi trên Mac OS X, mặc dù nó trả về một số âm vì ngày tháng trước thời đại Unix. Vì vậy, lý do là việc triển khai mktime của nền tảng của bạn có thể không hỗ trợ ngày trước kỷ nguyên Unix. Bạn có thể sử dụng mô-đun datetime Python để xây dựng một đối tượng datetime tương ứng với ngày trên, trừ nó từ một đối tượng datetime đại diện cho kỷ nguyên Unix và sử dụng các tính timedelta đối tượng để có được số giây kể từ khi kỷ nguyên:

from datetime import datetime 
epoch = datetime(1970, 1, 1) 
t = datetime(1956, 3, 2) 
diff = t-epoch 
print diff.days * 24 * 3600 + diff.seconds 

Cập nhật: nếu bạn đang sử dụng Python 2.7 trở lên, bạn có thể chỉ cần sử dụng print diff.total_seconds() như được lưu ý bên dưới trong bình luận của Chad Miller.

+1

in diff.total_seconds() –

+0

Cảm ơn, tôi đã cập nhật câu trả lời của mình. Python 2.5 và 2.6 đã phổ biến hơn nhiều trong năm 2010 khi tôi thêm câu trả lời này và 'total_seconds()' có sẵn từ 2.7 trở đi. –

Các vấn đề liên quan