void MIIntervalFromPyDelta(PyObject* pyDelta, MI_Interval& interval) { ZeroMemory(&interval, sizeof(MI_Interval)); int days = PyDateTime_DELTA_GET_DAYS(pyDelta); if (days < 0) { throw MI::Exception(L"Negative datetime.timedelta intervals are not supported"); } interval.days = (MI_Uint32)days; MI_Uint32 daySeconds = (MI_Uint32)PyDateTime_DELTA_GET_SECONDS(pyDelta); interval.hours = daySeconds / 3600; interval.minutes = (daySeconds - interval.hours * 3600) / 60; interval.seconds = daySeconds - interval.hours * 3600 - interval.minutes * 60; interval.microseconds = (MI_Uint32)PyDateTime_DELTA_GET_MICROSECONDS(pyDelta); }
static PyObject * _pydatetime_string_delta(pydatetimeObject *self) { PyDateTime_Delta *obj = (PyDateTime_Delta*)self->wrapped; char buffer[8]; int i; int a = PyDateTime_DELTA_GET_MICROSECONDS(obj); for (i=0; i < 6 ; i++) { buffer[5-i] = '0' + (a % 10); a /= 10; } buffer[6] = '\0'; return Bytes_FromFormat("'%d days %d.%s seconds'::interval", PyDateTime_DELTA_GET_DAYS(obj), PyDateTime_DELTA_GET_SECONDS(obj), buffer); }
static void * pydelta_to_timespec(PyObject *td, struct timespec *ts) { if (!PyDelta_Check(td)) { return NULL; } /* ts->tv_nsec = (PyDateTime_DELTA_GET_MICROSECONDS(td) % MICROSEC) * 1000; */ ts->tv_nsec = MICRO2NANO(PyDateTime_DELTA_GET_MICROSECONDS(td)); ts->tv_sec = PyDateTime_DELTA_GET_SECONDS(td); if (PyErr_Occurred() != NULL) { return NULL; } ts->tv_sec += PyDateTime_DELTA_GET_DAYS(td) * 24 * 60 * 60; if (PyErr_Occurred() != NULL) { return NULL; } printf("pydelta_to_timespec sec: %ld, nsec: %ld\n", ts->tv_sec, ts->tv_nsec); return td; }//pydelta_to_timespec()
EXPORT UDate PyObject_AsUDate(PyObject *object) { if (PyFloat_CheckExact(object)) return (UDate) (PyFloat_AsDouble(object) * 1000.0); else { if (PyDateTime_CheckExact(object)) { PyObject *tzinfo = PyObject_GetAttrString(object, "tzinfo"); PyObject *utcoffset, *ordinal; if (tzinfo == Py_None) { PyObject *m = PyImport_ImportModule("icu"); PyObject *cls = PyObject_GetAttrString(m, "ICUtzinfo"); tzinfo = PyObject_CallMethodObjArgs(cls, getDefault_NAME, NULL); Py_DECREF(cls); Py_DECREF(m); utcoffset = PyObject_CallMethodObjArgs(tzinfo, utcoffset_NAME, object, NULL); Py_DECREF(tzinfo); } else { utcoffset = PyObject_CallMethodObjArgs(object, utcoffset_NAME, NULL); Py_DECREF(tzinfo); } ordinal = PyObject_CallMethodObjArgs(object, toordinal_NAME, NULL); if (utcoffset != NULL && PyDelta_CheckExact(utcoffset) && ordinal != NULL && PyInt_CheckExact(ordinal)) { #if PY_MAJOR_VERSION >= 3 double ordinalValue = PyLong_AsDouble(ordinal); #else long ordinalValue = PyInt_AsLong(ordinal); #endif double timestamp = (ordinalValue - 719163) * 86400.0 + PyDateTime_DATE_GET_HOUR(object) * 3600.0 + PyDateTime_DATE_GET_MINUTE(object) * 60.0 + (double) PyDateTime_DATE_GET_SECOND(object) + PyDateTime_DATE_GET_MICROSECOND(object) / 1e6 - #ifndef PYPY_VERSION (((PyDateTime_Delta *) utcoffset)->days * 86400.0 + (double) ((PyDateTime_Delta *) utcoffset)->seconds); #else (PyDateTime_DELTA_GET_DAYS( (PyDateTime_Delta *) utcoffset) * 86400.0 + (double) PyDateTime_DELTA_GET_SECONDS( (PyDateTime_Delta *) utcoffset)); #endif Py_DECREF(utcoffset); Py_DECREF(ordinal); return (UDate) (timestamp * 1000.0); } Py_XDECREF(utcoffset); Py_XDECREF(ordinal); } } PyErr_SetObject(PyExc_TypeError, object); throw ICUException(); }