@@ -60,9 +60,11 @@ const PyDate_HEAD = sizeof(Int)+sizeof(PyPtr)+sizeof(Py_hash_t)+1
60
60
const DateType = Ref {PyPtr} (0 )
61
61
const DateTimeType = Ref {PyPtr} (0 )
62
62
const DeltaType = Ref {PyPtr} (0 )
63
+ const TimeType = Ref {PyPtr} (0 )
63
64
const Date_FromDate = Ref {Ptr{Cvoid}} (0 )
64
65
const DateTime_FromDateAndTime = Ref {Ptr{Cvoid}} (0 )
65
66
const Delta_FromDelta = Ref {Ptr{Cvoid}} (0 )
67
+ const Time_FromTime = Ref {Ptr{Cvoid}} (0 )
66
68
function init_datetime ()
67
69
# emulate PyDateTime_IMPORT:
68
70
PyDateTimeAPI = unsafe_load (@pycheckn ccall ((@pysym :PyCapsule_Import ),
@@ -71,9 +73,11 @@ function init_datetime()
71
73
DateType[] = PyDateTimeAPI. DateType
72
74
DateTimeType[] = PyDateTimeAPI. DateTimeType
73
75
DeltaType[] = PyDateTimeAPI. DeltaType
76
+ TimeType[] = PyDateTimeAPI. TimeType
74
77
Date_FromDate[] = PyDateTimeAPI. Date_FromDate
75
78
DateTime_FromDateAndTime[] = PyDateTimeAPI. DateTime_FromDateAndTime
76
79
Delta_FromDelta[] = PyDateTimeAPI. Delta_FromDelta
80
+ Time_FromTime[] = PyDateTimeAPI. Time_FromTime
77
81
end
78
82
79
83
PyObject (d:: Dates.Date ) =
@@ -99,6 +103,13 @@ PyDelta_FromDSU(days, seconds, useconds) =
99
103
100
104
PyObject (p:: Dates.Day ) = PyDelta_FromDSU (Dates. value (p), 0 , 0 )
101
105
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
+
102
113
function PyObject (p:: Dates.Second )
103
114
# normalize to make Cint overflow less likely
104
115
s = Dates. value (p)
@@ -120,12 +131,15 @@ end
120
131
PyDate_Check (o:: PyObject ) = pyisinstance (o, DateType[])
121
132
PyDateTime_Check (o:: PyObject ) = pyisinstance (o, DateTimeType[])
122
133
PyDelta_Check (o:: PyObject ) = pyisinstance (o, DeltaType[])
134
+ PyTime_Check (o:: PyObject ) = pyisinstance (o, TimeType[])
123
135
124
136
function pydate_query (o:: PyObject )
125
137
if PyDate_Check (o)
126
138
return PyDateTime_Check (o) ? Dates. DateTime : Dates. Date
127
139
elseif PyDelta_Check (o)
128
140
return Dates. Millisecond
141
+ elseif PyTime_Check (o)
142
+ return Dates. Time
129
143
else
130
144
return Union{}
131
145
end
@@ -163,6 +177,20 @@ function convert(::Type{Dates.Date}, o::PyObject)
163
177
end
164
178
end
165
179
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
+
166
194
function delta_dsμ (o:: PyObject )
167
195
PyDelta_Check (o) || throw (ArgumentError (" $o is not a timedelta instance" ))
168
196
p = GC. @preserve o unsafe_load (convert (Ptr{PyDateTime_Delta{Py_hash_t}}, PyPtr (o)))
0 commit comments