diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2015-09-18 11:23:02 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2015-09-18 11:23:02 (GMT) |
commit | 1e2b6882fc28a3cded227f55e4dc3f937afd678e (patch) | |
tree | 761eed5c9da66d8748b6382cd49589850cdf1e49 /Include/pytime.h | |
parent | 1bd0b54c74ea7a108e4a7d921bf9ff904c6fa4d7 (diff) | |
download | cpython-1e2b6882fc28a3cded227f55e4dc3f937afd678e.zip cpython-1e2b6882fc28a3cded227f55e4dc3f937afd678e.tar.gz cpython-1e2b6882fc28a3cded227f55e4dc3f937afd678e.tar.bz2 |
Issue #25155: Add _PyTime_AsTimevalTime_t() function
On Windows, the tv_sec field of the timeval structure has the type C long,
whereas it has the type C time_t on all other platforms. A C long has a size of
32 bits (signed inter, 1 bit for the sign, 31 bits for the value) which is not
enough to store an Epoch timestamp after the year 2038.
Add the _PyTime_AsTimevalTime_t() function written for datetime.datetime.now():
convert a _PyTime_t timestamp to a (secs, us) tuple where secs type is time_t.
It allows to support dates after the year 2038 on Windows.
Enhance also _PyTime_AsTimeval_impl() to detect overflow on the number of
seconds when rounding the number of microseconds.
Diffstat (limited to 'Include/pytime.h')
-rw-r--r-- | Include/pytime.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/Include/pytime.h b/Include/pytime.h index 5de756a..98612e1 100644 --- a/Include/pytime.h +++ b/Include/pytime.h @@ -120,6 +120,18 @@ PyAPI_FUNC(int) _PyTime_AsTimeval_noraise(_PyTime_t t, struct timeval *tv, _PyTime_round_t round); +/* Convert a timestamp to a number of seconds (secs) and microseconds (us). + us is always positive. This function is similar to _PyTime_AsTimeval() + except that secs is always a time_t type, whereas the timeval structure + uses a C long for tv_sec on Windows. + Raise an exception and return -1 if the conversion overflowed, + return 0 on success. */ +PyAPI_FUNC(int) _PyTime_AsTimevalTime_t( + _PyTime_t t, + time_t *secs, + int *us, + _PyTime_round_t round); + #if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE) /* Convert a timestamp to a timespec structure (nanosecond resolution). tv_nsec is always positive. |