/* Set the instance's value using the given date and time. calendar may be set to the flags: GREGORIAN_CALENDAR, JULIAN_CALENDAR to indicate the calendar to be used. */ static int dInfoCalc_SetFromAbsDateTime(struct date_info *dinfo, long_t absdate, double abstime, int calendar) { /* Bounds check */ Py_AssertWithArg(abstime >= 0.0 && abstime <= SECONDS_PER_DAY, PyExc_ValueError, "abstime out of range (0.0 - 86400.0): %f", abstime); /* Calculate the date */ if (dInfoCalc_SetFromAbsDate(dinfo, absdate, calendar)) goto onError; /* Calculate the time */ if (dInfoCalc_SetFromAbsTime(dinfo, abstime)) goto onError; return 0; onError: return INT_ERR_CODE; }
/* * Modified version of mxDateTime function * Returns absolute number of days since Jan 1, 1970 * assuming a proleptic Gregorian Calendar * Raises a ValueError if out of range month or day * day -1 is Dec 31, 1969, day 0 is Jan 1, 1970, day 1 is Jan 2, 1970 */ static npy_longlong days_from_ymd(int year, int month, int day) { /* Calculate the absolute date */ int leap; npy_longlong yearoffset, absdate; /* Is it a leap year ? */ leap = is_leapyear(year); /* Negative month values indicate months relative to the years end */ if (month < 0) month += 13; Py_AssertWithArg(month >= 1 && month <= 12, PyExc_ValueError, "month out of range (1-12): %i", month); /* Negative values indicate days relative to the months end */ if (day < 0) day += days_in_month[leap][month - 1] + 1; Py_AssertWithArg(day >= 1 && day <= days_in_month[leap][month - 1], PyExc_ValueError, "day out of range: %i", day); /* * Number of days between Dec 31, (year - 1) and Dec 31, 1969 * (can be negative). */ yearoffset = year_offset(year); if (PyErr_Occurred()) goto onError; /* * Calculate the number of days using yearoffset * Jan 1, 1970 is day 0 and thus Dec. 31, 1969 is day -1 */ absdate = day-1 + month_offset[leap][month - 1] + yearoffset; return absdate; onError: return 0; }
static int dInfoCalc_SetFromDateAndTime(struct date_info *dinfo, int year, int month, int day, int hour, int minute, double second, int calendar) { /* Calculate the absolute date */ { int leap; npy_int64 absdate; int yearoffset; /* Range check */ Py_AssertWithArg(year > -(INT_MAX / 366) && year < (INT_MAX / 366), PyExc_ValueError, "year out of range: %i", year); /* Is it a leap year ? */ leap = dInfoCalc_Leapyear(year, calendar); /* Negative month values indicate months relative to the years end */ if (month < 0) month += 13; Py_AssertWithArg(month >= 1 && month <= 12, PyExc_ValueError, "month out of range (1-12): %i", month); /* Negative values indicate days relative to the months end */ if (day < 0) day += days_in_month[leap][month - 1] + 1; Py_AssertWithArg(day >= 1 && day <= days_in_month[leap][month - 1], PyExc_ValueError, "day out of range: %i", day); yearoffset = dInfoCalc_YearOffset(year, calendar); if (PyErr_Occurred()) goto onError; absdate = day + month_offset[leap][month - 1] + yearoffset; dinfo->absdate = absdate; dinfo->year = year; dinfo->month = month; dinfo->quarter = ((month-1)/3)+1; dinfo->day = day; dinfo->day_of_week = dInfoCalc_DayOfWeek(absdate); dinfo->day_of_year = (short)(absdate - yearoffset); dinfo->calendar = calendar; } /* Calculate the absolute time */ { Py_AssertWithArg(hour >= 0 && hour <= 23, PyExc_ValueError, "hour out of range (0-23): %i", hour); Py_AssertWithArg(minute >= 0 && minute <= 59, PyExc_ValueError, "minute out of range (0-59): %i", minute); Py_AssertWithArg(second >= (double)0.0 && (second < (double)60.0 || (hour == 23 && minute == 59 && second < (double)61.0)), PyExc_ValueError, "second out of range (0.0 - <60.0; <61.0 for 23:59): %f", second); dinfo->abstime = (double)(hour*3600 + minute*60) + second; dinfo->hour = hour; dinfo->minute = minute; dinfo->second = second; } return 0; onError: return INT_ERR_CODE; }