57PyObject* buildTimedelta(
int days,
int secs,
int usecs)
63 return PyDelta_FromDSU(days, secs, usecs);
66int getTimedelta(PyObject* obj,
int &days,
int &secs,
int &usecs)
72 if (!PyDelta_Check(obj))
74 PyErr_SetString(PyExc_TypeError,
"not a datetime.timedelta");
77 days = PyDateTime_DELTA_GET_DAYS(obj);
78 secs = PyDateTime_DELTA_GET_SECONDS(obj);
79 usecs = PyDateTime_DELTA_GET_MICROSECONDS(obj);
89 using namespace std::chrono_literals;
96 using TMicroSeconds = std::chrono::duration<int, std::micro>;
98 const TMicroSeconds uSec = std::chrono::duration_cast<TMicroSeconds>(v.time_since_epoch() % 1s);
99 const std::time_t time = TClock::to_time_t(v - uSec);
102#if LASS_PLATFORM_TYPE == LASS_PLATFORM_TYPE_WIN32
103 const errno_t err = localtime_s(&local, &time);
106 localtime_r(&time, &local);
115 return PyDateTime_FromDateAndTime(
116 1900 + local.tm_year,
130 using namespace std::chrono_literals;
136 if (!PyDate_Check(obj))
138 PyErr_SetString(PyExc_TypeError,
"not a datetime.date or datetime.datetime");
146 PyDateTime_GET_DAY(obj),
147 PyDateTime_GET_MONTH(obj) - 1,
148 PyDateTime_GET_YEAR(obj) - 1900,
152#if LASS_PLATFORM_TYPE != LASS_PLATFORM_TYPE_WIN32
157 std::chrono::microseconds uSec{};
158 PyObject* tz = Py_None;
160 if (PyDateTime_Check(obj))
162 time.tm_hour = PyDateTime_DATE_GET_HOUR(obj);
163 time.tm_min = PyDateTime_DATE_GET_MINUTE(obj);
164 time.tm_sec = PyDateTime_DATE_GET_SECOND(obj);
165 uSec = std::chrono::microseconds(PyDateTime_DATE_GET_MICROSECOND(obj));
167 tz = PyDateTime_DATE_GET_TZINFO(obj);
173 const std::time_t t = mktime(&time);
176 PyErr_SetString(PyExc_ValueError,
"out of range");
179 v = TClock::from_time_t(t) + uSec;
183 TPyObjPtr timedelta{ PyObject_CallMethod(tz,
"utcoffset",
"O", obj) };
188 std::chrono::system_clock::duration utcoffset{};
189 if (PyExportTraits<std::chrono::system_clock::duration>::get(timedelta.get(), utcoffset) != 0)
193#if LASS_PLATFORM_TYPE == LASS_PLATFORM_TYPE_WIN32
194 const std::time_t t = _mkgmtime(&time);
196 const std::time_t t = timegm(&time);
200 PyErr_SetString(PyExc_ValueError,
"out of range");
203 v = TClock::from_time_t(t) + uSec - utcoffset;
211#ifdef LASS_HAVE_STD_CHRONO_CPP20
213PyObject* PyExportTraits<std::chrono::utc_clock::time_point>::build(
const std::chrono::utc_clock::time_point& v)
215 using namespace std::chrono_literals;
222 using TMicroSeconds = std::chrono::duration<int, std::micro>;
224 const auto sysTime = std::chrono::utc_clock::to_sys(v);
225 const TMicroSeconds uSec = std::chrono::duration_cast<TMicroSeconds>(sysTime.time_since_epoch() % 1s);
226 const std::time_t time = std::chrono::system_clock::to_time_t(sysTime - uSec);
229#if LASS_PLATFORM_TYPE == LASS_PLATFORM_TYPE_WIN32
230 const errno_t err = gmtime_s(&local, &time);
233 gmtime_r(&time, &local);
242 PyObject* tz = PyDateTime_TimeZone_UTC;
244 return PyDateTimeAPI->DateTime_FromDateAndTime(
245 1900 + local.tm_year,
253 PyDateTimeAPI->DateTimeType
259int PyExportTraits<std::chrono::utc_clock::time_point>::get(PyObject* obj, std::chrono::utc_clock::time_point& v)
261 std::chrono::system_clock::time_point sysTime;
262 if (PyExportTraits<std::chrono::system_clock::time_point>::get(obj, sysTime) != 0)
266 v = std::chrono::clock_cast<std::chrono::utc_clock>(sysTime);
272PyObject* PyExportTraits<std::chrono::gps_clock::time_point>::build(
const std::chrono::gps_clock::time_point& v)
274 auto utcTime = std::chrono::clock_cast<std::chrono::utc_clock>(v);
275 return PyExportTraits<std::chrono::utc_clock::time_point>::build(utcTime);
280int PyExportTraits<std::chrono::gps_clock::time_point>::get(PyObject* obj, std::chrono::gps_clock::time_point& v)
282 std::chrono::system_clock::time_point sysTime;
283 if (PyExportTraits<std::chrono::system_clock::time_point>::get(obj, sysTime) != 0)
287 v = std::chrono::clock_cast<std::chrono::gps_clock>(sysTime);
293PyObject* PyExportTraits<std::chrono::tai_clock::time_point>::build(
const std::chrono::tai_clock::time_point& v)
295 auto utcTime = std::chrono::clock_cast<std::chrono::utc_clock>(v);
296 return PyExportTraits<std::chrono::utc_clock::time_point>::build(utcTime);
301int PyExportTraits<std::chrono::tai_clock::time_point>::get(PyObject* obj, std::chrono::tai_clock::time_point& v)
303 std::chrono::system_clock::time_point sysTime;
304 if (PyExportTraits<std::chrono::system_clock::time_point>::get(obj, sysTime) != 0)
308 v = std::chrono::clock_cast<std::chrono::tai_clock>(sysTime);
314PyObject* PyExportTraits<std::chrono::file_clock::time_point>::build(
const std::chrono::file_clock::time_point& v)
316 auto utcTime = std::chrono::clock_cast<std::chrono::utc_clock>(v);
317 return PyExportTraits<std::chrono::utc_clock::time_point>::build(utcTime);
322int PyExportTraits<std::chrono::file_clock::time_point>::get(PyObject* obj, std::chrono::file_clock::time_point& v)
324 std::chrono::system_clock::time_point sysTime;
325 if (PyExportTraits<std::chrono::system_clock::time_point>::get(obj, sysTime) != 0)
329 v = std::chrono::clock_cast<std::chrono::file_clock>(sysTime);
335PyObject* PyExportTraits<std::chrono::year_month_day>::build(
const std::chrono::year_month_day& v)
341 return PyDate_FromDate(
342 static_cast<int>(v.year()),
343 static_cast<unsigned>(v.month()),
344 static_cast<unsigned>(v.day())
350int PyExportTraits<std::chrono::year_month_day>::get(PyObject* obj, std::chrono::year_month_day& v)
356 if (!PyDate_Check(obj))
358 PyErr_SetString(PyExc_TypeError,
"not a datetime.date");
361 v = std::chrono::year_month_day
363 std::chrono::year{ PyDateTime_GET_YEAR(obj) },
364 std::chrono::month{ PyDateTime_GET_MONTH(obj) },
365 std::chrono::day{ PyDateTime_GET_DAY(obj) }
const std::string lass_strerror(int errnum)
returns message associated to an CLIB error code
int lass_errno()
returns CLIB errno
void lass_reset_errno()
sets CLIB errno to zero.
PyObjectPtr< PyObject >::Type TPyObjPtr
PyObjectPtr to a PyObject.
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.
by copy, general case assumes shadow type or PyObjectPlus based type.