Friday, 29 August 2014

[python] time delta in seconds

UPDATED: thêm bằng chứng từ code C
Có một lỗi mà khi sử dụng module ``datetime`` trong python 2, có thể bạn đã mắc phải.

Trả lời câu hỏi sau, không dùng đến code:
In [28]: (datetime.datetime(2014,8,30,16,45,2) - datetime.datetime(2014, 8, 29, 16, 45, 2)).seconds

Trả về kết quả là bao nhiêu?


Nếu câu trả lời là 0, bạn không cần đọc tiếp bài này.
Nếu câu trả lời khác, hãy cùng tìm hiểu tại sao:
Thử vài ví dụ:
In [27]: (datetime.datetime(2014,8,30,15,45,2) - datetime.datetime(2014, 8, 29, 16, 45, 2)).seconds
Out[27]: 82800
In [28]: (datetime.datetime(2014,8,30,16,45,2) - datetime.datetime(2014, 8, 29, 16, 45, 2)).seconds
Out[28]: 0
In [29]: (datetime.datetime(2014,8,30,16,45,2) - datetime.datetime(2014, 8, 29, 16, 45, 2)).total_seconds()
Out[29]: 86400.0
Như đã thấy, để lấy số seconds của timedelta, phải sử dụng method ``total_seconds()``.
Dùng ``.seconds`` chỉ trả về (delta tính bằng seconds) modulo 86400 (chia lấy dư).

Happy debugging!
Hết.


Updated 30/8/2014
Từ code của python2.7
Python-2.7/Modules/datetimemodule.c
 ....
 730 static PyObject *
 731 new_delta_ex(int days, int seconds, int microseconds, int normalize,
 732              PyTypeObject *type)
 733 {
 734     PyDateTime_Delta *self;
 735
 736     if (normalize)
 737         normalize_d_s_us(&days, &seconds, &microseconds);
 738     assert(0 <= seconds && seconds < 24*3600);