Ejemplo n.º 1
0
  /* 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;
  }
Ejemplo n.º 2
0
  /* 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));
  }
Ejemplo n.º 3
0
  /* 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));
  }
Ejemplo n.º 4
0
 /* Returns the day of the given datetime value.
  */
 public static SchemaTypeNumber dayFromDatetime(SchemaDateTime value) {
   return new SchemaInt(value.getDay());
 }