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();
}