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#if PY_VERSION_HEX >= 0x030a0000
168 tz = PyDateTime_DATE_GET_TZINFO(obj);
170 TPyObjPtr tz_(PyObject_GetAttrString(obj,
"tzinfo"));
182 const std::time_t t = mktime(&time);
185 PyErr_SetString(PyExc_ValueError,
"out of range");
188 v = TClock::from_time_t(t) + uSec;
192 TPyObjPtr timedelta{ PyObject_CallMethod(tz,
"utcoffset",
"O", obj) };
197 std::chrono::system_clock::duration utcoffset{};
198 if (PyExportTraits<std::chrono::system_clock::duration>::get(timedelta.get(), utcoffset) != 0)
202#if LASS_PLATFORM_TYPE == LASS_PLATFORM_TYPE_WIN32
203 const std::time_t t = _mkgmtime(&time);
205 const std::time_t t = timegm(&time);
209 PyErr_SetString(PyExc_ValueError,
"out of range");
212 v = TClock::from_time_t(t) + uSec - utcoffset;
220#ifdef LASS_HAVE_STD_CHRONO_CPP20
222PyObject* PyExportTraits<std::chrono::utc_clock::time_point>::build(
const std::chrono::utc_clock::time_point& v)
224 using namespace std::chrono_literals;
231 using TMicroSeconds = std::chrono::duration<int, std::micro>;
233 const auto sysTime = std::chrono::utc_clock::to_sys(v);
234 const TMicroSeconds uSec = std::chrono::duration_cast<TMicroSeconds>(sysTime.time_since_epoch() % 1s);
235 const std::time_t time = std::chrono::system_clock::to_time_t(sysTime - uSec);
238#if LASS_PLATFORM_TYPE == LASS_PLATFORM_TYPE_WIN32
239 const errno_t err = gmtime_s(&local, &time);
242 gmtime_r(&time, &local);
251 PyObject* tz = PyDateTime_TimeZone_UTC;
253 return PyDateTimeAPI->DateTime_FromDateAndTime(
254 1900 + local.tm_year,
262 PyDateTimeAPI->DateTimeType
268int PyExportTraits<std::chrono::utc_clock::time_point>::get(PyObject* obj, std::chrono::utc_clock::time_point& v)
270 std::chrono::system_clock::time_point sysTime;
271 if (PyExportTraits<std::chrono::system_clock::time_point>::get(obj, sysTime) != 0)
275 v = std::chrono::clock_cast<std::chrono::utc_clock>(sysTime);
281PyObject* PyExportTraits<std::chrono::gps_clock::time_point>::build(
const std::chrono::gps_clock::time_point& v)
283 auto utcTime = std::chrono::clock_cast<std::chrono::utc_clock>(v);
284 return PyExportTraits<std::chrono::utc_clock::time_point>::build(utcTime);
289int PyExportTraits<std::chrono::gps_clock::time_point>::get(PyObject* obj, std::chrono::gps_clock::time_point& v)
291 std::chrono::system_clock::time_point sysTime;
292 if (PyExportTraits<std::chrono::system_clock::time_point>::get(obj, sysTime) != 0)
296 v = std::chrono::clock_cast<std::chrono::gps_clock>(sysTime);
302PyObject* PyExportTraits<std::chrono::tai_clock::time_point>::build(
const std::chrono::tai_clock::time_point& v)
304 auto utcTime = std::chrono::clock_cast<std::chrono::utc_clock>(v);
305 return PyExportTraits<std::chrono::utc_clock::time_point>::build(utcTime);
310int PyExportTraits<std::chrono::tai_clock::time_point>::get(PyObject* obj, std::chrono::tai_clock::time_point& v)
312 std::chrono::system_clock::time_point sysTime;
313 if (PyExportTraits<std::chrono::system_clock::time_point>::get(obj, sysTime) != 0)
317 v = std::chrono::clock_cast<std::chrono::tai_clock>(sysTime);
323PyObject* PyExportTraits<std::chrono::file_clock::time_point>::build(
const std::chrono::file_clock::time_point& v)
325 auto utcTime = std::chrono::clock_cast<std::chrono::utc_clock>(v);
326 return PyExportTraits<std::chrono::utc_clock::time_point>::build(utcTime);
331int PyExportTraits<std::chrono::file_clock::time_point>::get(PyObject* obj, std::chrono::file_clock::time_point& v)
333 std::chrono::system_clock::time_point sysTime;
334 if (PyExportTraits<std::chrono::system_clock::time_point>::get(obj, sysTime) != 0)
338 v = std::chrono::clock_cast<std::chrono::file_clock>(sysTime);
344PyObject* PyExportTraits<std::chrono::year_month_day>::build(
const std::chrono::year_month_day& v)
350 return PyDate_FromDate(
351 static_cast<int>(v.year()),
352 static_cast<unsigned>(v.month()),
353 static_cast<unsigned>(v.day())
359int PyExportTraits<std::chrono::year_month_day>::get(PyObject* obj, std::chrono::year_month_day& v)
365 if (!PyDate_Check(obj))
367 PyErr_SetString(PyExc_TypeError,
"not a datetime.date");
370 v = std::chrono::year_month_day
372 std::chrono::year{ PyDateTime_GET_YEAR(obj) },
373 std::chrono::month{ PyDateTime_GET_MONTH(obj) },
374 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.