@@ -60,9 +60,11 @@ const PyDate_HEAD = sizeof(Int)+sizeof(PyPtr)+sizeof(Py_hash_t)+1
6060const DateType = Ref {PyPtr} (0 )
6161const DateTimeType = Ref {PyPtr} (0 )
6262const DeltaType = Ref {PyPtr} (0 )
63+ const TimeType = Ref {PyPtr} (0 )
6364const Date_FromDate = Ref {Ptr{Cvoid}} (0 )
6465const DateTime_FromDateAndTime = Ref {Ptr{Cvoid}} (0 )
6566const Delta_FromDelta = Ref {Ptr{Cvoid}} (0 )
67+ const Time_FromTime = Ref {Ptr{Cvoid}} (0 )
6668function init_datetime ()
6769 # emulate PyDateTime_IMPORT:
6870 PyDateTimeAPI = unsafe_load (@pycheckn ccall ((@pysym :PyCapsule_Import ),
@@ -71,9 +73,11 @@ function init_datetime()
7173 DateType[] = PyDateTimeAPI. DateType
7274 DateTimeType[] = PyDateTimeAPI. DateTimeType
7375 DeltaType[] = PyDateTimeAPI. DeltaType
76+ TimeType[] = PyDateTimeAPI. TimeType
7477 Date_FromDate[] = PyDateTimeAPI. Date_FromDate
7578 DateTime_FromDateAndTime[] = PyDateTimeAPI. DateTime_FromDateAndTime
7679 Delta_FromDelta[] = PyDateTimeAPI. Delta_FromDelta
80+ Time_FromTime[] = PyDateTimeAPI. Time_FromTime
7781end
7882
7983PyObject (d:: Dates.Date ) =
@@ -99,6 +103,13 @@ PyDelta_FromDSU(days, seconds, useconds) =
99103
100104PyObject (p:: Dates.Day ) = PyDelta_FromDSU (Dates. value (p), 0 , 0 )
101105
106+ PyObject (t:: Dates.Time ) =
107+ PyObject (@pycheckn ccall (Time_FromTime[], PyPtr,
108+ (Cint, Cint, Cint, Cint, PyPtr, PyPtr),
109+ Dates. hour (t), Dates. minute (t), Dates. second (t),
110+ Dates. millisecond (t) * 1000 ,
111+ pynothing[], TimeType[]))
112+
102113function PyObject (p:: Dates.Second )
103114 # normalize to make Cint overflow less likely
104115 s = Dates. value (p)
@@ -120,12 +131,15 @@ end
120131PyDate_Check (o:: PyObject ) = pyisinstance (o, DateType[])
121132PyDateTime_Check (o:: PyObject ) = pyisinstance (o, DateTimeType[])
122133PyDelta_Check (o:: PyObject ) = pyisinstance (o, DeltaType[])
134+ PyTime_Check (o:: PyObject ) = pyisinstance (o, TimeType[])
123135
124136function pydate_query (o:: PyObject )
125137 if PyDate_Check (o)
126138 return PyDateTime_Check (o) ? Dates. DateTime : Dates. Date
127139 elseif PyDelta_Check (o)
128140 return Dates. Millisecond
141+ elseif PyTime_Check (o)
142+ return Dates. Time
129143 else
130144 return Union{}
131145 end
@@ -163,6 +177,20 @@ function convert(::Type{Dates.Date}, o::PyObject)
163177 end
164178end
165179
180+ function convert (:: Type{Dates.Time} , o:: PyObject )
181+ if PyTime_Check (o)
182+ GC. @preserve o let dt = convert (Ptr{UInt8}, PyPtr (o)) + PyDate_HEAD
183+ Dates. Time (unsafe_load (dt,1 ), unsafe_load (dt,2 ), # hour, minute
184+ unsafe_load (dt,3 ), # second
185+ div ((UInt (unsafe_load (dt,4 )) << 16 ) |
186+ (UInt (unsafe_load (dt,5 )) << 8 ) |
187+ unsafe_load (dt,6 ), 1000 )) # μs ÷ 1000
188+ end
189+ else
190+ throw (ArgumentError (" unknown Time type $o " ))
191+ end
192+ end
193+
166194function delta_dsμ (o:: PyObject )
167195 PyDelta_Check (o) || throw (ArgumentError (" $o is not a timedelta instance" ))
168196 p = GC. @preserve o unsafe_load (convert (Ptr{PyDateTime_Delta{Py_hash_t}}, PyPtr (o)))
0 commit comments