| from cpython.object cimport PyObject
|
| from cpython.version cimport PY_VERSION_HEX
|
|
|
| cdef extern from "Python.h":
|
| ctypedef struct PyTypeObject:
|
| pass
|
|
|
| cdef extern from "datetime.h":
|
| """
|
| /* Backport for Python 2.x */
|
| #if PY_MAJOR_VERSION < 3
|
| #ifndef PyDateTime_DELTA_GET_DAYS
|
| #define PyDateTime_DELTA_GET_DAYS(o) (((PyDateTime_Delta*)o)->days)
|
| #endif
|
| #ifndef PyDateTime_DELTA_GET_SECONDS
|
| #define PyDateTime_DELTA_GET_SECONDS(o) (((PyDateTime_Delta*)o)->seconds)
|
| #endif
|
| #ifndef PyDateTime_DELTA_GET_MICROSECONDS
|
| #define PyDateTime_DELTA_GET_MICROSECONDS(o) (((PyDateTime_Delta*)o)->microseconds)
|
| #endif
|
| #endif
|
|
|
| /* Backport for Python < 3.6 */
|
| #if PY_VERSION_HEX < 0x030600a4
|
| #ifndef PyDateTime_TIME_GET_FOLD
|
| #define PyDateTime_TIME_GET_FOLD(o) ((void)(o), 0)
|
| #endif
|
| #ifndef PyDateTime_DATE_GET_FOLD
|
| #define PyDateTime_DATE_GET_FOLD(o) ((void)(o), 0)
|
| #endif
|
| #endif
|
|
|
| /* Backport for Python < 3.6 */
|
| #if PY_VERSION_HEX < 0x030600a4
|
| #define __Pyx_DateTime_DateTimeWithFold(year, month, day, hour, minute, second, microsecond, tz, fold) \
|
| ((void)(fold), PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, minute, second, \
|
| microsecond, tz, PyDateTimeAPI->DateTimeType))
|
| #define __Pyx_DateTime_TimeWithFold(hour, minute, second, microsecond, tz, fold) \
|
| ((void)(fold), PyDateTimeAPI->Time_FromTime(hour, minute, second, microsecond, tz, PyDateTimeAPI->TimeType))
|
| #else /* For Python 3.6+ so that we can pass tz */
|
| #define __Pyx_DateTime_DateTimeWithFold(year, month, day, hour, minute, second, microsecond, tz, fold) \
|
| PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(year, month, day, hour, minute, second, \
|
| microsecond, tz, fold, PyDateTimeAPI->DateTimeType)
|
| #define __Pyx_DateTime_TimeWithFold(hour, minute, second, microsecond, tz, fold) \
|
| PyDateTimeAPI->Time_FromTimeAndFold(hour, minute, second, microsecond, tz, fold, PyDateTimeAPI->TimeType)
|
| #endif
|
|
|
| /* Backport for Python < 3.7 */
|
| #if PY_VERSION_HEX < 0x030700b1
|
| #define __Pyx_TimeZone_UTC NULL
|
| #define __Pyx_TimeZone_FromOffsetAndName(offset, name) ((void)(offset), (void)(name), (PyObject*)NULL)
|
| #else
|
| #define __Pyx_TimeZone_UTC PyDateTime_TimeZone_UTC
|
| #define __Pyx_TimeZone_FromOffsetAndName(offset, name) PyTimeZone_FromOffsetAndName(offset, name)
|
| #endif
|
|
|
| /* Backport for Python < 3.10 */
|
| #if PY_VERSION_HEX < 0x030a00a1
|
| #ifndef PyDateTime_TIME_GET_TZINFO
|
| #define PyDateTime_TIME_GET_TZINFO(o) \
|
| ((((PyDateTime_Time*)o)->hastzinfo) ? ((PyDateTime_Time*)o)->tzinfo : Py_None)
|
| #endif
|
| #ifndef PyDateTime_DATE_GET_TZINFO
|
| #define PyDateTime_DATE_GET_TZINFO(o) \
|
| ((((PyDateTime_DateTime*)o)->hastzinfo) ? ((PyDateTime_DateTime*)o)->tzinfo : Py_None)
|
| #endif
|
| #endif
|
| """
|
|
|
| ctypedef extern class datetime.date[object PyDateTime_Date]:
|
| @property
|
| cdef inline int year(self) noexcept:
|
| return PyDateTime_GET_YEAR(self)
|
|
|
| @property
|
| cdef inline int month(self) noexcept:
|
| return PyDateTime_GET_MONTH(self)
|
|
|
| @property
|
| cdef inline int day(self) noexcept:
|
| return PyDateTime_GET_DAY(self)
|
|
|
| ctypedef extern class datetime.time[object PyDateTime_Time]:
|
| @property
|
| cdef inline int hour(self) noexcept:
|
| return PyDateTime_TIME_GET_HOUR(self)
|
|
|
| @property
|
| cdef inline int minute(self) noexcept:
|
| return PyDateTime_TIME_GET_MINUTE(self)
|
|
|
| @property
|
| cdef inline int second(self) noexcept:
|
| return PyDateTime_TIME_GET_SECOND(self)
|
|
|
| @property
|
| cdef inline int microsecond(self) noexcept:
|
| return PyDateTime_TIME_GET_MICROSECOND(self)
|
|
|
| @property
|
| cdef inline object tzinfo(self):
|
| return <object>PyDateTime_TIME_GET_TZINFO(self)
|
|
|
| @property
|
| cdef inline int fold(self) noexcept:
|
|
|
| return PyDateTime_TIME_GET_FOLD(self)
|
|
|
| ctypedef extern class datetime.datetime[object PyDateTime_DateTime]:
|
| @property
|
| cdef inline int year(self) noexcept:
|
| return PyDateTime_GET_YEAR(self)
|
|
|
| @property
|
| cdef inline int month(self) noexcept:
|
| return PyDateTime_GET_MONTH(self)
|
|
|
| @property
|
| cdef inline int day(self) noexcept:
|
| return PyDateTime_GET_DAY(self)
|
|
|
| @property
|
| cdef inline int hour(self) noexcept:
|
| return PyDateTime_DATE_GET_HOUR(self)
|
|
|
| @property
|
| cdef inline int minute(self) noexcept:
|
| return PyDateTime_DATE_GET_MINUTE(self)
|
|
|
| @property
|
| cdef inline int second(self) noexcept:
|
| return PyDateTime_DATE_GET_SECOND(self)
|
|
|
| @property
|
| cdef inline int microsecond(self) noexcept:
|
| return PyDateTime_DATE_GET_MICROSECOND(self)
|
|
|
| @property
|
| cdef inline object tzinfo(self):
|
| return <object>PyDateTime_DATE_GET_TZINFO(self)
|
|
|
| @property
|
| cdef inline int fold(self) noexcept:
|
|
|
| return PyDateTime_DATE_GET_FOLD(self)
|
|
|
| ctypedef extern class datetime.timedelta[object PyDateTime_Delta]:
|
| @property
|
| cdef inline int day(self) noexcept:
|
| return PyDateTime_DELTA_GET_DAYS(self)
|
|
|
| @property
|
| cdef inline int second(self) noexcept:
|
| return PyDateTime_DELTA_GET_SECONDS(self)
|
|
|
| @property
|
| cdef inline int microsecond(self) noexcept:
|
| return PyDateTime_DELTA_GET_MICROSECONDS(self)
|
|
|
| ctypedef extern class datetime.tzinfo[object PyDateTime_TZInfo]:
|
| pass
|
|
|
| ctypedef struct PyDateTime_Date:
|
| pass
|
|
|
| ctypedef struct PyDateTime_Time:
|
| unsigned char fold
|
| char hastzinfo
|
| PyObject *tzinfo
|
|
|
| ctypedef struct PyDateTime_DateTime:
|
| unsigned char fold
|
| char hastzinfo
|
| PyObject *tzinfo
|
|
|
| ctypedef struct PyDateTime_Delta:
|
| int days
|
| int seconds
|
| int microseconds
|
|
|
|
|
| ctypedef struct PyDateTime_CAPI:
|
|
|
| PyTypeObject *DateType
|
| PyTypeObject *DateTimeType
|
| PyTypeObject *TimeType
|
| PyTypeObject *DeltaType
|
| PyTypeObject *TZInfoType
|
|
|
|
|
| date (*Date_FromDate)(int, int, int, PyTypeObject*)
|
| datetime (*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, object, PyTypeObject*)
|
| time (*Time_FromTime)(int, int, int, int, object, PyTypeObject*)
|
| timedelta (*Delta_FromDelta)(int, int, int, int, PyTypeObject*)
|
|
|
|
|
| datetime (*DateTime_FromTimestamp)(PyObject*, object, PyObject*)
|
| date (*Date_FromTimestamp)(PyObject*, object)
|
|
|
|
|
|
|
|
|
|
|
| object (*TimeZone_FromTimeZone)(object offset, PyObject *name)
|
|
|
|
|
| PyObject *TimeZone_UTC
|
|
|
|
|
| datetime (*DateTime_FromDateAndTimeAndFold)(int, int, int, int, int, int, int, object, int, PyTypeObject*)
|
| time (*Time_FromTimeAndFold)(int, int, int ,int, object, int, PyTypeObject*)
|
|
|
|
|
| bint PyDate_Check(object op)
|
| bint PyDate_CheckExact(object op)
|
|
|
| bint PyDateTime_Check(object op)
|
| bint PyDateTime_CheckExact(object op)
|
|
|
| bint PyTime_Check(object op)
|
| bint PyTime_CheckExact(object op)
|
|
|
| bint PyDelta_Check(object op)
|
| bint PyDelta_CheckExact(object op)
|
|
|
| bint PyTZInfo_Check(object op)
|
| bint PyTZInfo_CheckExact(object op)
|
|
|
|
|
| int PyDateTime_GET_YEAR(object o)
|
| int PyDateTime_GET_MONTH(object o)
|
| int PyDateTime_GET_DAY(object o)
|
|
|
|
|
| int PyDateTime_DATE_GET_HOUR(object o)
|
| int PyDateTime_DATE_GET_MINUTE(object o)
|
| int PyDateTime_DATE_GET_SECOND(object o)
|
| int PyDateTime_DATE_GET_MICROSECOND(object o)
|
| int PyDateTime_DATE_GET_FOLD(object o)
|
| PyObject* PyDateTime_DATE_GET_TZINFO(object o)
|
|
|
|
|
| int PyDateTime_TIME_GET_HOUR(object o)
|
| int PyDateTime_TIME_GET_MINUTE(object o)
|
| int PyDateTime_TIME_GET_SECOND(object o)
|
| int PyDateTime_TIME_GET_MICROSECOND(object o)
|
| int PyDateTime_TIME_GET_FOLD(object o)
|
| PyObject* PyDateTime_TIME_GET_TZINFO(object o)
|
|
|
|
|
| int PyDateTime_DELTA_GET_DAYS(object o)
|
| int PyDateTime_DELTA_GET_SECONDS(object o)
|
| int PyDateTime_DELTA_GET_MICROSECONDS(object o)
|
|
|
|
|
| object PyTimeZone_FromOffset(object offset)
|
| object PyTimeZone_FromOffsetAndName(object offset, object name)
|
|
|
|
|
| object __Pyx_TimeZone_FromOffsetAndName(object offset, PyObject* name)
|
|
|
|
|
| datetime PyDateTime_FromTimeStamp(object args)
|
| date PyDate_FromTimeStamp(object args)
|
|
|
|
|
| datetime __Pyx_DateTime_DateTimeWithFold(int, int, int, int, int, int, int, object, int)
|
| datetime __Pyx_DateTime_TimeWithFold(int, int, int ,int, object, int)
|
|
|
|
|
| PyDateTime_CAPI *PyDateTimeAPI
|
|
|
| PyObject* PyDateTime_TimeZone_UTC
|
|
|
|
|
| PyObject* __Pyx_TimeZone_UTC
|
|
|
| void PyDateTime_IMPORT()
|
|
|
|
|
|
|
| cdef inline void import_datetime() noexcept:
|
| PyDateTime_IMPORT
|
|
|
|
|
|
|
| cdef inline date date_new(int year, int month, int day):
|
| return PyDateTimeAPI.Date_FromDate(year, month, day, PyDateTimeAPI.DateType)
|
|
|
|
|
|
|
| cdef inline time time_new(int hour, int minute, int second, int microsecond, object tz, int fold=0):
|
| return __Pyx_DateTime_TimeWithFold(hour, minute, second, microsecond, tz, fold)
|
|
|
|
|
|
|
| cdef inline datetime datetime_new(int year, int month, int day, int hour, int minute, int second, int microsecond, object tz, int fold=0):
|
| return __Pyx_DateTime_DateTimeWithFold(year, month, day, hour, minute, second, microsecond, tz, fold)
|
|
|
|
|
|
|
| cdef inline timedelta timedelta_new(int days, int seconds, int useconds):
|
| return PyDateTimeAPI.Delta_FromDelta(days, seconds, useconds, 1, PyDateTimeAPI.DeltaType)
|
|
|
|
|
| cdef inline object timezone_new(object offset, object name=None):
|
| if PY_VERSION_HEX < 0x030700b1:
|
| raise RuntimeError('Time zones are not available from the C-API.')
|
| return __Pyx_TimeZone_FromOffsetAndName(offset, <PyObject*>name if name is not None else NULL)
|
|
|
|
|
| cdef inline datetime datetime_from_timestamp(timestamp, tz=None):
|
| return PyDateTimeAPI.DateTime_FromTimestamp(
|
| <PyObject*>PyDateTimeAPI.DateTimeType, (timestamp, tz) if tz is not None else (timestamp,), NULL)
|
|
|
|
|
| cdef inline date date_from_timestamp(timestamp):
|
| return PyDateTimeAPI.Date_FromTimestamp(<PyObject*>PyDateTimeAPI.DateType, (timestamp,))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| cdef inline object get_utc():
|
| if PY_VERSION_HEX < 0x030700b1:
|
| raise RuntimeError('Time zones are not available from the C-API.')
|
| return <object>__Pyx_TimeZone_UTC
|
|
|
|
|
| cdef inline object time_tzinfo(object o):
|
| return <object>PyDateTime_TIME_GET_TZINFO(o)
|
|
|
|
|
| cdef inline object datetime_tzinfo(object o):
|
| return <object>PyDateTime_DATE_GET_TZINFO(o)
|
|
|
|
|
| cdef inline int date_year(object o) noexcept:
|
| return PyDateTime_GET_YEAR(o)
|
|
|
|
|
| cdef inline int date_month(object o) noexcept:
|
| return PyDateTime_GET_MONTH(o)
|
|
|
|
|
| cdef inline int date_day(object o) noexcept:
|
| return PyDateTime_GET_DAY(o)
|
|
|
|
|
| cdef inline int datetime_year(object o) noexcept:
|
| return PyDateTime_GET_YEAR(o)
|
|
|
|
|
| cdef inline int datetime_month(object o) noexcept:
|
| return PyDateTime_GET_MONTH(o)
|
|
|
|
|
| cdef inline int datetime_day(object o) noexcept:
|
| return PyDateTime_GET_DAY(o)
|
|
|
|
|
| cdef inline int time_hour(object o) noexcept:
|
| return PyDateTime_TIME_GET_HOUR(o)
|
|
|
|
|
| cdef inline int time_minute(object o) noexcept:
|
| return PyDateTime_TIME_GET_MINUTE(o)
|
|
|
|
|
| cdef inline int time_second(object o) noexcept:
|
| return PyDateTime_TIME_GET_SECOND(o)
|
|
|
|
|
| cdef inline int time_microsecond(object o) noexcept:
|
| return PyDateTime_TIME_GET_MICROSECOND(o)
|
|
|
|
|
| cdef inline int time_fold(object o) noexcept:
|
|
|
| return PyDateTime_TIME_GET_FOLD(o)
|
|
|
|
|
| cdef inline int datetime_hour(object o) noexcept:
|
| return PyDateTime_DATE_GET_HOUR(o)
|
|
|
|
|
| cdef inline int datetime_minute(object o) noexcept:
|
| return PyDateTime_DATE_GET_MINUTE(o)
|
|
|
|
|
| cdef inline int datetime_second(object o) noexcept:
|
| return PyDateTime_DATE_GET_SECOND(o)
|
|
|
|
|
| cdef inline int datetime_microsecond(object o) noexcept:
|
| return PyDateTime_DATE_GET_MICROSECOND(o)
|
|
|
|
|
| cdef inline int datetime_fold(object o) noexcept:
|
|
|
| return PyDateTime_DATE_GET_FOLD(o)
|
|
|
|
|
| cdef inline int timedelta_days(object o) noexcept:
|
| return (<PyDateTime_Delta*>o).days
|
|
|
|
|
| cdef inline int timedelta_seconds(object o) noexcept:
|
| return (<PyDateTime_Delta*>o).seconds
|
|
|
|
|
| cdef inline int timedelta_microseconds(object o) noexcept:
|
| return (<PyDateTime_Delta*>o).microseconds
|
|
|
| cdef inline double total_seconds(timedelta obj) noexcept:
|
|
|
|
|
|
|
| cdef:
|
| double days, seconds, micros
|
| days = <double>PyDateTime_DELTA_GET_DAYS(obj)
|
| seconds = <double>PyDateTime_DELTA_GET_SECONDS(obj)
|
| micros = <double>PyDateTime_DELTA_GET_MICROSECONDS(obj)
|
| return days * 24 * 3600 + seconds + micros / 1_000_000
|
|
|