/* Returns the day of week of the given datetime value. Sunday=1, Monday=2,... */ public static SchemaTypeNumber weekday(SchemaDateTime value) { long a = (14 - value.getMonth()) / 12; long m = value.getMonth() + 12 * a - 3; long y = value.getYear() + 4800 - a; long JD = value.getDay() + (153 * m + 2) / 5 + y * 365 + y / 4 - y / 100 + y / 400 - 32045; return new SchemaInt((int) (JD % 7 + 1)); }
/* Returns the number of the week within the year of the given datetime value. */ public static SchemaTypeNumber weeknumber(SchemaDateTime value) { long a = (14 - value.getMonth()) / 12; long m = value.getMonth() + 12 * a - 3; long y = value.getYear() + 4800 - a; long JD = value.getDay() + (153 * m + 2) / 5 + y * 365 + y / 4 - y / 100 + y / 400 - 32045; long d4 = (JD + 31741 - (JD % 7)) % 146097 % 36524 % 1461; long L = d4 / 1460; long d1 = ((d4 - L) % 365) + L; return new SchemaInt((int) (d1 / 7 + 1)); }
/* Performs a addition of dates, times and durations. */ public static SchemaDateTime datetimeAdd(SchemaDateTime datetime, SchemaDuration duration) { int months = duration.getYearMonthValue(); SchemaDateTime result = new SchemaDateTime(datetime); result.setMonth(datetime.getMonth() + months); int yearsOverflow; if (result.getMonth() >= 1) yearsOverflow = (result.getMonth() - 1) / 12; else yearsOverflow = (result.getMonth() - 12) / 12; result.setMonth(result.getMonth() - yearsOverflow * 12); if (yearsOverflow > 0 && result.getYear() < 0 && yearsOverflow >= -result.getYear()) result.setYear(result.getYear() + yearsOverflow + 1); else if (yearsOverflow < 0 && result.getYear() > 0 && -yearsOverflow >= result.getYear()) result.setYear(result.getYear() + yearsOverflow - 1); else result.setYear(result.getYear() + yearsOverflow); boolean leapYear = (result.getYear() % 4 == 0) && ((result.getYear() % 100 != 0) || (result.getYear() % 400 == 0)); int daysInMonth = result.getMonth() == 2 ? leapYear ? 29 : 28 : (30 + ((result.getMonth() & 1) ^ ((result.getMonth() >> 3) & 1))); if (result.getDay() > daysInMonth) result.setDay(daysInMonth); long tv = result.getTimeValue() + duration.getDayTimeValue() + result.getTimezoneOffset() * 60000; result.setTimeFromTimeValue(tv); result.setDateFromTimeValue(tv); return result; }
/* Returns the month of the given datetime value. */ public static SchemaTypeNumber monthFromDatetime(SchemaDateTime value) { return new SchemaInt(value.getMonth()); }