package com.aggrepoint.utils; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; public class DateUtils { public static Date get(int year, int month, int day) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month); cal.set(Calendar.DAY_OF_MONTH, day); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return cal.getTime(); } public static Date dayStart(Date dt) { if (dt == null) return null; Calendar cal = Calendar.getInstance(); cal.setTime(dt); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return cal.getTime(); } public static Date dayEnd(Date dt) { if (dt == null) return null; Calendar cal = Calendar.getInstance(); cal.setTime(dt); cal.set(Calendar.HOUR_OF_DAY, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59); cal.set(Calendar.MILLISECOND, 999); return cal.getTime(); } public static boolean sameDay(Date dt1, Date dt2) { if (dt1 == null && dt2 == null) return true; if (dt1 == null || dt2 == null) return false; Calendar cal1 = Calendar.getInstance(); cal1.setTime(dt1); Calendar cal2 = Calendar.getInstance(); cal2.setTime(dt2); return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH) && cal1.get(Calendar.DAY_OF_MONTH) == cal2 .get(Calendar.DAY_OF_MONTH); } public static Date addDay(Date dt, int n) { if (dt == null) return null; Calendar cal = Calendar.getInstance(); cal.setTime(dt); cal.add(Calendar.DAY_OF_YEAR, n); return cal.getTime(); } public static Date addMonth(Date dt, int n) { if (dt == null) return null; Calendar cal = Calendar.getInstance(); cal.setTime(dt); cal.add(Calendar.MONTH, n); return cal.getTime(); } public static Date prevDate(Date dt) { return addDay(dt, -1); } public static Date nextDate(Date dt) { return addDay(dt, 1); } public static Date toGmt(Date dt, TimeZone tz) { if (dt == null) return null; if (tz == null) tz = TimeZone.getDefault(); long time = dt.getTime(); if (tz.inDaylightTime(dt)) time -= tz.getDSTSavings(); time -= tz.getRawOffset(); return new Date(time); } public static Date toGmt(Date dt) { if (dt == null) return null; return toGmt(dt, null); } public static int getYear(Date dt) { Calendar cal = Calendar.getInstance(); cal.setTime(dt); return cal.get(Calendar.YEAR); } public static int getAge(Date dateOfBirth, Date onDate) { Calendar now = Calendar.getInstance(); Calendar dob = Calendar.getInstance(); now.setTime(onDate); dob.setTime(dateOfBirth); if (dob.after(now)) return -1; int year1 = now.get(Calendar.YEAR); int year2 = dob.get(Calendar.YEAR); int age = year1 - year2; int month1 = now.get(Calendar.MONTH); int month2 = dob.get(Calendar.MONTH); if (month2 > month1) { age--; } else if (month1 == month2) { int day1 = now.get(Calendar.DAY_OF_MONTH); int day2 = dob.get(Calendar.DAY_OF_MONTH); if (day2 > day1) { age--; } } return age; } public static int getMonth(Date dateOfBirth, Date onDate) { Calendar now = Calendar.getInstance(); Calendar dob = Calendar.getInstance(); now.setTime(onDate); dob.setTime(dateOfBirth); if (dob.after(now)) return -1; int year1 = now.get(Calendar.YEAR); int year2 = dob.get(Calendar.YEAR); int month1 = now.get(Calendar.MONTH); int month2 = dob.get(Calendar.MONTH); int day1 = now.get(Calendar.DAY_OF_MONTH); int day2 = dob.get(Calendar.DAY_OF_MONTH); int months = (year1 - year2) * 12 + month1 - month2; if (day2 > day1) months--; return months; } static int GRADE_YEAR = 0; static long GRADE_YEAR_VALID_TO = 0; public static synchronized int getCurrentGradeYear() { if (System.currentTimeMillis() > GRADE_YEAR_VALID_TO) { Calendar cal = Calendar.getInstance(); GRADE_YEAR = cal.get(Calendar.YEAR); if (cal.get(Calendar.MONTH) <= Calendar.JUNE) GRADE_YEAR--; GRADE_YEAR_VALID_TO = System.currentTimeMillis() + 60 * 1000l; } return GRADE_YEAR; } public static int getGradeYear(Date date) { if (date == null) return getCurrentGradeYear(); Calendar cal = Calendar.getInstance(); cal.setTime(date); int gradeYear = cal.get(Calendar.YEAR); if (cal.get(Calendar.MONTH) <= Calendar.JUNE) gradeYear--; return gradeYear; } /** * 学生在year年的9月份是grade年级,计算他在onDate是几年级 */ public static int getGrade(int year, int grade, Date onDate) { Calendar calOnDate = Calendar.getInstance(); calOnDate.setTime(onDate); int onDateYear = calOnDate.get(Calendar.YEAR); if (calOnDate.get(Calendar.MONTH) < Calendar.SEPTEMBER) onDateYear--; grade += (onDateYear - year); if (grade < 0) grade = 0; else if (grade > 13) // 0 = JK, 1 = SK, ... 13 = grade 12 grade = 13; return grade; } /** * 学生在year年的9月份是grade年级,计算他在onYear的9月份是几年级 */ public static Integer getGrade(Integer year, Integer grade, Integer onYear) { if (year == null || grade == null || onYear == null) return null; grade += onYear - year; if (grade < 0) grade = 0; else if (grade > 13) grade = 13; return grade; } public static String getAgeDisplay(Date dateOfBirth) { if (dateOfBirth == null) return ""; Date now = new Date(); int year = getAge(dateOfBirth, now); int month = getMonth(dateOfBirth, now) % 12; StringBuffer sb = new StringBuffer(); sb.append(year); if (year > 1) sb.append(" yrs "); else sb.append(" yr "); if (month == 0) return sb.toString(); if (month > 1) sb.append(month).append(" mos"); else sb.append(month).append(" mo"); return sb.toString(); } }