17db96d56Sopenharmony_ci/* datetime.h 27db96d56Sopenharmony_ci */ 37db96d56Sopenharmony_ci#ifndef Py_LIMITED_API 47db96d56Sopenharmony_ci#ifndef DATETIME_H 57db96d56Sopenharmony_ci#define DATETIME_H 67db96d56Sopenharmony_ci#ifdef __cplusplus 77db96d56Sopenharmony_ciextern "C" { 87db96d56Sopenharmony_ci#endif 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci/* Fields are packed into successive bytes, each viewed as unsigned and 117db96d56Sopenharmony_ci * big-endian, unless otherwise noted: 127db96d56Sopenharmony_ci * 137db96d56Sopenharmony_ci * byte offset 147db96d56Sopenharmony_ci * 0 year 2 bytes, 1-9999 157db96d56Sopenharmony_ci * 2 month 1 byte, 1-12 167db96d56Sopenharmony_ci * 3 day 1 byte, 1-31 177db96d56Sopenharmony_ci * 4 hour 1 byte, 0-23 187db96d56Sopenharmony_ci * 5 minute 1 byte, 0-59 197db96d56Sopenharmony_ci * 6 second 1 byte, 0-59 207db96d56Sopenharmony_ci * 7 usecond 3 bytes, 0-999999 217db96d56Sopenharmony_ci * 10 227db96d56Sopenharmony_ci */ 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci/* # of bytes for year, month, and day. */ 257db96d56Sopenharmony_ci#define _PyDateTime_DATE_DATASIZE 4 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ci/* # of bytes for hour, minute, second, and usecond. */ 287db96d56Sopenharmony_ci#define _PyDateTime_TIME_DATASIZE 6 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci/* # of bytes for year, month, day, hour, minute, second, and usecond. */ 317db96d56Sopenharmony_ci#define _PyDateTime_DATETIME_DATASIZE 10 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_citypedef struct 357db96d56Sopenharmony_ci{ 367db96d56Sopenharmony_ci PyObject_HEAD 377db96d56Sopenharmony_ci Py_hash_t hashcode; /* -1 when unknown */ 387db96d56Sopenharmony_ci int days; /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */ 397db96d56Sopenharmony_ci int seconds; /* 0 <= seconds < 24*3600 is invariant */ 407db96d56Sopenharmony_ci int microseconds; /* 0 <= microseconds < 1000000 is invariant */ 417db96d56Sopenharmony_ci} PyDateTime_Delta; 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_citypedef struct 447db96d56Sopenharmony_ci{ 457db96d56Sopenharmony_ci PyObject_HEAD /* a pure abstract base class */ 467db96d56Sopenharmony_ci} PyDateTime_TZInfo; 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci/* The datetime and time types have hashcodes, and an optional tzinfo member, 507db96d56Sopenharmony_ci * present if and only if hastzinfo is true. 517db96d56Sopenharmony_ci */ 527db96d56Sopenharmony_ci#define _PyTZINFO_HEAD \ 537db96d56Sopenharmony_ci PyObject_HEAD \ 547db96d56Sopenharmony_ci Py_hash_t hashcode; \ 557db96d56Sopenharmony_ci char hastzinfo; /* boolean flag */ 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci/* No _PyDateTime_BaseTZInfo is allocated; it's just to have something 587db96d56Sopenharmony_ci * convenient to cast to, when getting at the hastzinfo member of objects 597db96d56Sopenharmony_ci * starting with _PyTZINFO_HEAD. 607db96d56Sopenharmony_ci */ 617db96d56Sopenharmony_citypedef struct 627db96d56Sopenharmony_ci{ 637db96d56Sopenharmony_ci _PyTZINFO_HEAD 647db96d56Sopenharmony_ci} _PyDateTime_BaseTZInfo; 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci/* All time objects are of PyDateTime_TimeType, but that can be allocated 677db96d56Sopenharmony_ci * in two ways, with or without a tzinfo member. Without is the same as 687db96d56Sopenharmony_ci * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an 697db96d56Sopenharmony_ci * internal struct used to allocate the right amount of space for the 707db96d56Sopenharmony_ci * "without" case. 717db96d56Sopenharmony_ci */ 727db96d56Sopenharmony_ci#define _PyDateTime_TIMEHEAD \ 737db96d56Sopenharmony_ci _PyTZINFO_HEAD \ 747db96d56Sopenharmony_ci unsigned char data[_PyDateTime_TIME_DATASIZE]; 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_citypedef struct 777db96d56Sopenharmony_ci{ 787db96d56Sopenharmony_ci _PyDateTime_TIMEHEAD 797db96d56Sopenharmony_ci} _PyDateTime_BaseTime; /* hastzinfo false */ 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_citypedef struct 827db96d56Sopenharmony_ci{ 837db96d56Sopenharmony_ci _PyDateTime_TIMEHEAD 847db96d56Sopenharmony_ci unsigned char fold; 857db96d56Sopenharmony_ci PyObject *tzinfo; 867db96d56Sopenharmony_ci} PyDateTime_Time; /* hastzinfo true */ 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci/* All datetime objects are of PyDateTime_DateTimeType, but that can be 907db96d56Sopenharmony_ci * allocated in two ways too, just like for time objects above. In addition, 917db96d56Sopenharmony_ci * the plain date type is a base class for datetime, so it must also have 927db96d56Sopenharmony_ci * a hastzinfo member (although it's unused there). 937db96d56Sopenharmony_ci */ 947db96d56Sopenharmony_citypedef struct 957db96d56Sopenharmony_ci{ 967db96d56Sopenharmony_ci _PyTZINFO_HEAD 977db96d56Sopenharmony_ci unsigned char data[_PyDateTime_DATE_DATASIZE]; 987db96d56Sopenharmony_ci} PyDateTime_Date; 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ci#define _PyDateTime_DATETIMEHEAD \ 1017db96d56Sopenharmony_ci _PyTZINFO_HEAD \ 1027db96d56Sopenharmony_ci unsigned char data[_PyDateTime_DATETIME_DATASIZE]; 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_citypedef struct 1057db96d56Sopenharmony_ci{ 1067db96d56Sopenharmony_ci _PyDateTime_DATETIMEHEAD 1077db96d56Sopenharmony_ci} _PyDateTime_BaseDateTime; /* hastzinfo false */ 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_citypedef struct 1107db96d56Sopenharmony_ci{ 1117db96d56Sopenharmony_ci _PyDateTime_DATETIMEHEAD 1127db96d56Sopenharmony_ci unsigned char fold; 1137db96d56Sopenharmony_ci PyObject *tzinfo; 1147db96d56Sopenharmony_ci} PyDateTime_DateTime; /* hastzinfo true */ 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci 1177db96d56Sopenharmony_ci/* Apply for date and datetime instances. */ 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci// o is a pointer to a time or a datetime object. 1207db96d56Sopenharmony_ci#define _PyDateTime_HAS_TZINFO(o) (((_PyDateTime_BaseTZInfo *)(o))->hastzinfo) 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci#define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \ 1237db96d56Sopenharmony_ci ((PyDateTime_Date*)o)->data[1]) 1247db96d56Sopenharmony_ci#define PyDateTime_GET_MONTH(o) (((PyDateTime_Date*)o)->data[2]) 1257db96d56Sopenharmony_ci#define PyDateTime_GET_DAY(o) (((PyDateTime_Date*)o)->data[3]) 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci#define PyDateTime_DATE_GET_HOUR(o) (((PyDateTime_DateTime*)o)->data[4]) 1287db96d56Sopenharmony_ci#define PyDateTime_DATE_GET_MINUTE(o) (((PyDateTime_DateTime*)o)->data[5]) 1297db96d56Sopenharmony_ci#define PyDateTime_DATE_GET_SECOND(o) (((PyDateTime_DateTime*)o)->data[6]) 1307db96d56Sopenharmony_ci#define PyDateTime_DATE_GET_MICROSECOND(o) \ 1317db96d56Sopenharmony_ci ((((PyDateTime_DateTime*)o)->data[7] << 16) | \ 1327db96d56Sopenharmony_ci (((PyDateTime_DateTime*)o)->data[8] << 8) | \ 1337db96d56Sopenharmony_ci ((PyDateTime_DateTime*)o)->data[9]) 1347db96d56Sopenharmony_ci#define PyDateTime_DATE_GET_FOLD(o) (((PyDateTime_DateTime*)o)->fold) 1357db96d56Sopenharmony_ci#define PyDateTime_DATE_GET_TZINFO(o) (_PyDateTime_HAS_TZINFO(o) ? \ 1367db96d56Sopenharmony_ci ((PyDateTime_DateTime *)(o))->tzinfo : Py_None) 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci/* Apply for time instances. */ 1397db96d56Sopenharmony_ci#define PyDateTime_TIME_GET_HOUR(o) (((PyDateTime_Time*)o)->data[0]) 1407db96d56Sopenharmony_ci#define PyDateTime_TIME_GET_MINUTE(o) (((PyDateTime_Time*)o)->data[1]) 1417db96d56Sopenharmony_ci#define PyDateTime_TIME_GET_SECOND(o) (((PyDateTime_Time*)o)->data[2]) 1427db96d56Sopenharmony_ci#define PyDateTime_TIME_GET_MICROSECOND(o) \ 1437db96d56Sopenharmony_ci ((((PyDateTime_Time*)o)->data[3] << 16) | \ 1447db96d56Sopenharmony_ci (((PyDateTime_Time*)o)->data[4] << 8) | \ 1457db96d56Sopenharmony_ci ((PyDateTime_Time*)o)->data[5]) 1467db96d56Sopenharmony_ci#define PyDateTime_TIME_GET_FOLD(o) (((PyDateTime_Time*)o)->fold) 1477db96d56Sopenharmony_ci#define PyDateTime_TIME_GET_TZINFO(o) (_PyDateTime_HAS_TZINFO(o) ? \ 1487db96d56Sopenharmony_ci ((PyDateTime_Time *)(o))->tzinfo : Py_None) 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci/* Apply for time delta instances */ 1517db96d56Sopenharmony_ci#define PyDateTime_DELTA_GET_DAYS(o) (((PyDateTime_Delta*)o)->days) 1527db96d56Sopenharmony_ci#define PyDateTime_DELTA_GET_SECONDS(o) (((PyDateTime_Delta*)o)->seconds) 1537db96d56Sopenharmony_ci#define PyDateTime_DELTA_GET_MICROSECONDS(o) \ 1547db96d56Sopenharmony_ci (((PyDateTime_Delta*)o)->microseconds) 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ci 1577db96d56Sopenharmony_ci/* Define structure for C API. */ 1587db96d56Sopenharmony_citypedef struct { 1597db96d56Sopenharmony_ci /* type objects */ 1607db96d56Sopenharmony_ci PyTypeObject *DateType; 1617db96d56Sopenharmony_ci PyTypeObject *DateTimeType; 1627db96d56Sopenharmony_ci PyTypeObject *TimeType; 1637db96d56Sopenharmony_ci PyTypeObject *DeltaType; 1647db96d56Sopenharmony_ci PyTypeObject *TZInfoType; 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_ci /* singletons */ 1677db96d56Sopenharmony_ci PyObject *TimeZone_UTC; 1687db96d56Sopenharmony_ci 1697db96d56Sopenharmony_ci /* constructors */ 1707db96d56Sopenharmony_ci PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*); 1717db96d56Sopenharmony_ci PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, 1727db96d56Sopenharmony_ci PyObject*, PyTypeObject*); 1737db96d56Sopenharmony_ci PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*); 1747db96d56Sopenharmony_ci PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*); 1757db96d56Sopenharmony_ci PyObject *(*TimeZone_FromTimeZone)(PyObject *offset, PyObject *name); 1767db96d56Sopenharmony_ci 1777db96d56Sopenharmony_ci /* constructors for the DB API */ 1787db96d56Sopenharmony_ci PyObject *(*DateTime_FromTimestamp)(PyObject*, PyObject*, PyObject*); 1797db96d56Sopenharmony_ci PyObject *(*Date_FromTimestamp)(PyObject*, PyObject*); 1807db96d56Sopenharmony_ci 1817db96d56Sopenharmony_ci /* PEP 495 constructors */ 1827db96d56Sopenharmony_ci PyObject *(*DateTime_FromDateAndTimeAndFold)(int, int, int, int, int, int, int, 1837db96d56Sopenharmony_ci PyObject*, int, PyTypeObject*); 1847db96d56Sopenharmony_ci PyObject *(*Time_FromTimeAndFold)(int, int, int, int, PyObject*, int, PyTypeObject*); 1857db96d56Sopenharmony_ci 1867db96d56Sopenharmony_ci} PyDateTime_CAPI; 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ci#define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI" 1897db96d56Sopenharmony_ci 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci/* This block is only used as part of the public API and should not be 1927db96d56Sopenharmony_ci * included in _datetimemodule.c, which does not use the C API capsule. 1937db96d56Sopenharmony_ci * See bpo-35081 for more details. 1947db96d56Sopenharmony_ci * */ 1957db96d56Sopenharmony_ci#ifndef _PY_DATETIME_IMPL 1967db96d56Sopenharmony_ci/* Define global variable for the C API and a macro for setting it. */ 1977db96d56Sopenharmony_cistatic PyDateTime_CAPI *PyDateTimeAPI = NULL; 1987db96d56Sopenharmony_ci 1997db96d56Sopenharmony_ci#define PyDateTime_IMPORT \ 2007db96d56Sopenharmony_ci PyDateTimeAPI = (PyDateTime_CAPI *)PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0) 2017db96d56Sopenharmony_ci 2027db96d56Sopenharmony_ci/* Macro for access to the UTC singleton */ 2037db96d56Sopenharmony_ci#define PyDateTime_TimeZone_UTC PyDateTimeAPI->TimeZone_UTC 2047db96d56Sopenharmony_ci 2057db96d56Sopenharmony_ci/* Macros for type checking when not building the Python core. */ 2067db96d56Sopenharmony_ci#define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType) 2077db96d56Sopenharmony_ci#define PyDate_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DateType) 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci#define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType) 2107db96d56Sopenharmony_ci#define PyDateTime_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DateTimeType) 2117db96d56Sopenharmony_ci 2127db96d56Sopenharmony_ci#define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType) 2137db96d56Sopenharmony_ci#define PyTime_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->TimeType) 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci#define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType) 2167db96d56Sopenharmony_ci#define PyDelta_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DeltaType) 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ci#define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) 2197db96d56Sopenharmony_ci#define PyTZInfo_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->TZInfoType) 2207db96d56Sopenharmony_ci 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci/* Macros for accessing constructors in a simplified fashion. */ 2237db96d56Sopenharmony_ci#define PyDate_FromDate(year, month, day) \ 2247db96d56Sopenharmony_ci PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType) 2257db96d56Sopenharmony_ci 2267db96d56Sopenharmony_ci#define PyDateTime_FromDateAndTime(year, month, day, hour, min, sec, usec) \ 2277db96d56Sopenharmony_ci PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, \ 2287db96d56Sopenharmony_ci min, sec, usec, Py_None, PyDateTimeAPI->DateTimeType) 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci#define PyDateTime_FromDateAndTimeAndFold(year, month, day, hour, min, sec, usec, fold) \ 2317db96d56Sopenharmony_ci PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(year, month, day, hour, \ 2327db96d56Sopenharmony_ci min, sec, usec, Py_None, fold, PyDateTimeAPI->DateTimeType) 2337db96d56Sopenharmony_ci 2347db96d56Sopenharmony_ci#define PyTime_FromTime(hour, minute, second, usecond) \ 2357db96d56Sopenharmony_ci PyDateTimeAPI->Time_FromTime(hour, minute, second, usecond, \ 2367db96d56Sopenharmony_ci Py_None, PyDateTimeAPI->TimeType) 2377db96d56Sopenharmony_ci 2387db96d56Sopenharmony_ci#define PyTime_FromTimeAndFold(hour, minute, second, usecond, fold) \ 2397db96d56Sopenharmony_ci PyDateTimeAPI->Time_FromTimeAndFold(hour, minute, second, usecond, \ 2407db96d56Sopenharmony_ci Py_None, fold, PyDateTimeAPI->TimeType) 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci#define PyDelta_FromDSU(days, seconds, useconds) \ 2437db96d56Sopenharmony_ci PyDateTimeAPI->Delta_FromDelta(days, seconds, useconds, 1, \ 2447db96d56Sopenharmony_ci PyDateTimeAPI->DeltaType) 2457db96d56Sopenharmony_ci 2467db96d56Sopenharmony_ci#define PyTimeZone_FromOffset(offset) \ 2477db96d56Sopenharmony_ci PyDateTimeAPI->TimeZone_FromTimeZone(offset, NULL) 2487db96d56Sopenharmony_ci 2497db96d56Sopenharmony_ci#define PyTimeZone_FromOffsetAndName(offset, name) \ 2507db96d56Sopenharmony_ci PyDateTimeAPI->TimeZone_FromTimeZone(offset, name) 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci/* Macros supporting the DB API. */ 2537db96d56Sopenharmony_ci#define PyDateTime_FromTimestamp(args) \ 2547db96d56Sopenharmony_ci PyDateTimeAPI->DateTime_FromTimestamp( \ 2557db96d56Sopenharmony_ci (PyObject*) (PyDateTimeAPI->DateTimeType), args, NULL) 2567db96d56Sopenharmony_ci 2577db96d56Sopenharmony_ci#define PyDate_FromTimestamp(args) \ 2587db96d56Sopenharmony_ci PyDateTimeAPI->Date_FromTimestamp( \ 2597db96d56Sopenharmony_ci (PyObject*) (PyDateTimeAPI->DateType), args) 2607db96d56Sopenharmony_ci 2617db96d56Sopenharmony_ci#endif /* !defined(_PY_DATETIME_IMPL) */ 2627db96d56Sopenharmony_ci 2637db96d56Sopenharmony_ci#ifdef __cplusplus 2647db96d56Sopenharmony_ci} 2657db96d56Sopenharmony_ci#endif 2667db96d56Sopenharmony_ci#endif 2677db96d56Sopenharmony_ci#endif /* !Py_LIMITED_API */ 268