1 from cpython.ref cimport PyObject 2 3 cdef extern from "Python.h": 4 ctypedef struct PyTypeObject: 5 pass 6 7 cdef extern from "datetime.h": 8 9 ctypedef extern class datetime.date[object PyDateTime_Date]: 10 pass 11 12 ctypedef extern class datetime.time[object PyDateTime_Time]: 13 pass 14 15 ctypedef extern class datetime.datetime[object PyDateTime_DateTime]: 16 pass 17 18 ctypedef extern class datetime.timedelta[object PyDateTime_Delta]: 19 pass 20 21 ctypedef extern class datetime.tzinfo[object PyDateTime_TZInfo]: 22 pass 23 24 ctypedef struct PyDateTime_Date: 25 pass 26 27 ctypedef struct PyDateTime_Time: 28 char hastzinfo 29 PyObject *tzinfo 30 31 ctypedef struct PyDateTime_DateTime: 32 char hastzinfo 33 PyObject *tzinfo 34 35 ctypedef struct PyDateTime_Delta: 36 int days 37 int seconds 38 int microseconds 39 40 # Define structure for C API. 41 ctypedef struct PyDateTime_CAPI: 42 # type objects 43 PyTypeObject *DateType 44 PyTypeObject *DateTimeType 45 PyTypeObject *TimeType 46 PyTypeObject *DeltaType 47 PyTypeObject *TZInfoType 48 49 # constructors 50 object (*Date_FromDate)(int, int, int, PyTypeObject*) 51 object (*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, object, PyTypeObject*) 52 object (*Time_FromTime)(int, int, int, int, object, PyTypeObject*) 53 object (*Delta_FromDelta)(int, int, int, int, PyTypeObject*) 54 55 # constructors for the DB API 56 object (*DateTime_FromTimestamp)(object, object, object) 57 object (*Date_FromTimestamp)(object, object) 58 59 # Check type of the object. 60 bint PyDate_Check(object op) 61 bint PyDate_CheckExact(object op) 62 63 bint PyDateTime_Check(object op) 64 bint PyDateTime_CheckExact(object op) 65 66 bint PyTime_Check(object op) 67 bint PyTime_CheckExact(object op) 68 69 bint PyDelta_Check(object op) 70 bint PyDelta_CheckExact(object op) 71 72 bint PyTZInfo_Check(object op) 73 bint PyTZInfo_CheckExact(object op) 74 75 # Getters for date and datetime (C macros). 76 int PyDateTime_GET_YEAR(object o) 77 int PyDateTime_GET_MONTH(object o) 78 int PyDateTime_GET_DAY(object o) 79 80 # Getters for datetime (C macros). 81 int PyDateTime_DATE_GET_HOUR(object o) 82 int PyDateTime_DATE_GET_MINUTE(object o) 83 int PyDateTime_DATE_GET_SECOND(object o) 84 int PyDateTime_DATE_GET_MICROSECOND(object o) 85 86 # Getters for time (C macros). 87 int PyDateTime_TIME_GET_HOUR(object o) 88 int PyDateTime_TIME_GET_MINUTE(object o) 89 int PyDateTime_TIME_GET_SECOND(object o) 90 int PyDateTime_TIME_GET_MICROSECOND(object o) 91 92 # Getters for timedelta (C macros). 93 #int PyDateTime_DELTA_GET_DAYS(object o) 94 #int PyDateTime_DELTA_GET_SECONDS(object o) 95 #int PyDateTime_DELTA_GET_MICROSECONDS(object o) 96 97 # PyDateTime CAPI object. 98 PyDateTime_CAPI *PyDateTimeAPI 99 100 void PyDateTime_IMPORT() 101 102 # Datetime C API initialization function. 103 # You have to call it before any usage of DateTime CAPI functions. 104 cdef inline void import_datetime(): 105 PyDateTime_IMPORT 106 107 # Create date object using DateTime CAPI factory function. 108 # Note, there are no range checks for any of the arguments. 109 cdef inline object date_new(int year, int month, int day): 110 return PyDateTimeAPI.Date_FromDate(year, month, day, PyDateTimeAPI.DateType) 111 112 # Create time object using DateTime CAPI factory function 113 # Note, there are no range checks for any of the arguments. 114 cdef inline object time_new(int hour, int minute, int second, int microsecond, object tz): 115 return PyDateTimeAPI.Time_FromTime(hour, minute, second, microsecond, tz, PyDateTimeAPI.TimeType) 116 117 # Create datetime object using DateTime CAPI factory function. 118 # Note, there are no range checks for any of the arguments. 119 cdef inline object datetime_new(int year, int month, int day, int hour, int minute, int second, int microsecond, object tz): 120 return PyDateTimeAPI.DateTime_FromDateAndTime(year, month, day, hour, minute, second, microsecond, tz, PyDateTimeAPI.DateTimeType) 121 122 # Create timedelta object using DateTime CAPI factory function. 123 # Note, there are no range checks for any of the arguments. 124 cdef inline object timedelta_new(int days, int seconds, int useconds): 125 return PyDateTimeAPI.Delta_FromDelta(days, seconds, useconds, 1, PyDateTimeAPI.DeltaType) 126 127 # More recognizable getters for date/time/datetime/timedelta. 128 # There are no setters because datetime.h hasn't them. 129 # This is because of immutable nature of these objects by design. 130 # If you would change time/date/datetime/timedelta object you need to recreate. 131 132 # Get tzinfo of time 133 cdef inline object time_tzinfo(object o): 134 if (<PyDateTime_Time*>o).hastzinfo: 135 return <object>(<PyDateTime_Time*>o).tzinfo 136 else: 137 return None 138 139 # Get tzinfo of datetime 140 cdef inline object datetime_tzinfo(object o): 141 if (<PyDateTime_DateTime*>o).hastzinfo: 142 return <object>(<PyDateTime_DateTime*>o).tzinfo 143 else: 144 return None 145 146 # Get year of date 147 cdef inline int date_year(object o): 148 return PyDateTime_GET_YEAR(o) 149 150 # Get month of date 151 cdef inline int date_month(object o): 152 return PyDateTime_GET_MONTH(o) 153 154 # Get day of date 155 cdef inline int date_day(object o): 156 return PyDateTime_GET_DAY(o) 157 158 # Get year of datetime 159 cdef inline int datetime_year(object o): 160 return PyDateTime_GET_YEAR(o) 161 162 # Get month of datetime 163 cdef inline int datetime_month(object o): 164 return PyDateTime_GET_MONTH(o) 165 166 # Get day of datetime 167 cdef inline int datetime_day(object o): 168 return PyDateTime_GET_DAY(o) 169 170 # Get hour of time 171 cdef inline int time_hour(object o): 172 return PyDateTime_TIME_GET_HOUR(o) 173 174 # Get minute of time 175 cdef inline int time_minute(object o): 176 return PyDateTime_TIME_GET_MINUTE(o) 177 178 # Get second of time 179 cdef inline int time_second(object o): 180 return PyDateTime_TIME_GET_SECOND(o) 181 182 # Get microsecond of time 183 cdef inline int time_microsecond(object o): 184 return PyDateTime_TIME_GET_MICROSECOND(o) 185 186 # Get hour of datetime 187 cdef inline int datetime_hour(object o): 188 return PyDateTime_DATE_GET_HOUR(o) 189 190 # Get minute of datetime 191 cdef inline int datetime_minute(object o): 192 return PyDateTime_DATE_GET_MINUTE(o) 193 194 # Get second of datetime 195 cdef inline int datetime_second(object o): 196 return PyDateTime_DATE_GET_SECOND(o) 197 198 # Get microsecond of datetime 199 cdef inline int datetime_microsecond(object o): 200 return PyDateTime_DATE_GET_MICROSECOND(o) 201 202 # Get days of timedelta 203 cdef inline int timedelta_days(object o): 204 return (<PyDateTime_Delta*>o).days 205 206 # Get seconds of timedelta 207 cdef inline int timedelta_seconds(object o): 208 return (<PyDateTime_Delta*>o).seconds 209 210 # Get microseconds of timedelta 211 cdef inline int timedelta_microseconds(object o): 212 return (<PyDateTime_Delta*>o).microseconds 213