public static Date rawtime2date()

in odps-sdk/odps-sdk-core/src/main/java/com/aliyun/odps/commons/util/DateUtils.java [235:315]


  public static Date rawtime2date(long rawtime, Calendar calendar) {
    int year, mon, day, hour, min, sec, leap;
    long offset;

    Calendar c = (Calendar) calendar.clone();

    if (rawtime < _0000_03_01_C) {
      offset = rawtime - _0000_01_01_C;
      sec = (int) (offset % 60);
      offset /= 60;
      min = (int) (offset % 60);
      offset /= 60;
      hour = (int) (offset % 24);
      offset /= 24;
      mon = (int) ((offset / 31) + 1);
      offset = offset % 31;
      day = (int) (offset + 1);
      year = 0;
    } else {
      offset = rawtime - _0000_03_01_08_C;
      if (rawtime > _1927_12_31_23_59_59_C) {
        offset = offset - 352;
      }
      if (rawtime >= _1940_06_03_01_C && rawtime < _1940_09_30_23_C) {
        offset = offset + 3600;
      } else if (rawtime >= _1941_03_16_01_C && rawtime < _1941_09_30_23_C) {
        offset = offset + 3600;
      } else if (rawtime >= _1986_05_04_01_C && rawtime < _1986_09_13_23_C) {
        offset = offset + 3600;
      } else if (rawtime >= _1987_04_12_01_C && rawtime < _1987_09_12_23_C) {
        offset = offset + 3600;
      } else if (rawtime >= _1988_04_10_01_C && rawtime < _1988_09_10_23_C) {
        offset = offset + 3600;
      } else if (rawtime >= _1989_04_16_01_C && rawtime < _1989_09_16_23_C) {
        offset = offset + 3600;
      } else if (rawtime >= _1990_04_15_01_C && rawtime < _1990_09_15_23_C) {
        offset = offset + 3600;
      } else if (rawtime >= _1991_04_14_01_C && rawtime < _1991_09_14_23_C) {
        offset = offset + 3600;
      }
      offset = offset + TZ * 60 * 60;

      sec = (int) (offset % 60);
      offset /= 60;
      min = (int) (offset % 60);
      offset /= 60;
      hour = (int) (offset % 24);
      offset /= 24;

      year = (int) (offset / 365);
      leap = year / 4 - year / 100 + year / 400;
      while (year * 365 + leap > offset) {
        year = year - 1;
        leap = year / 4 - year / 100 + year / 400;
      }
      offset = offset - (year * 365 + leap);

      int i = 12;
      while (offset < 367 * i / 12 - 30) {
        i--;
      }
      offset = offset - (367 * i / 12 - 30);
      mon = i + 2;
      if (mon > 12) {
        mon = mon - 12;
        year = year + 1;
      }

      day = (int) (offset + 1);
    }

    c.set(Calendar.YEAR, year);
    c.set(Calendar.MONTH, mon - 1);
    c.set(Calendar.DAY_OF_MONTH, day);
    c.set(Calendar.HOUR_OF_DAY, hour);
    c.set(Calendar.MINUTE, min);
    c.set(Calendar.SECOND, sec);
    c.set(Calendar.MILLISECOND, 0);

    return c.getTime();
  }