import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;/*** 日期工具**/
public class DateTimeUtils {// public static final SimpleDateFormat FORMAT_LONG = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");public static boolean isSameDay(Calendar cal1, Calendar cal2) {if (cal1 == null || cal2 == null) return false;return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) && cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR));}public static boolean isSameDay(Date date1, Date date2) {if (date1 == null || date2 == null) return false;Calendar cal1 = Calendar.getInstance();cal1.setTime(date1);Calendar cal2 = Calendar.getInstance();cal2.setTime(date2);return isSameDay(cal1, cal2);}public static boolean isSameInstant(Date date1, Date date2) {if (date1 == null || date2 == null) return false;return date1.getTime() == date2.getTime();}public static boolean isSameInstant(Calendar cal1, Calendar cal2) {if (cal1 == null || cal2 == null) return false;return cal1.getTime().getTime() == cal2.getTime().getTime();}public static Date addYears(Date date, int amount) {return add(date, Calendar.YEAR, amount);}public static Date addMonths(Date date, int amount) {return add(date, Calendar.MONTH, amount);}public static Date addWeeks(Date date, int amount) {return add(date, Calendar.WEEK_OF_YEAR, amount);}public static Date addDays(Date date, int amount) {return add(date, Calendar.DAY_OF_MONTH, amount);}public static Date addHours(Date date, int amount) {return add(date, Calendar.HOUR_OF_DAY, amount);}public static Date addMinutes(Date date, int amount) {return add(date, Calendar.MINUTE, amount);}public static Date addSeconds(Date date, int amount) {return add(date, Calendar.SECOND, amount);}public static Date addMilliseconds(Date date, int amount) {return add(date, Calendar.MILLISECOND, amount);}public static Date add(Date date, int calendarField, int amount) {if (date == null) throw new IllegalArgumentException("日期不能为空");Calendar c = Calendar.getInstance();c.setTime(date);c.add(calendarField, amount);return c.getTime();}public static String today() {return today("yyyy-MM-dd");}public static String now() {return today("yyyy-MM-dd HH:mm:ss SSS");}public static String today(String pattern) {if (pattern == null) throw new IllegalArgumentException("日期格式不能为空");SimpleDateFormat sdf = new SimpleDateFormat(pattern);String dt = sdf.format(new Date());return dt;}public static Date parseDate(String src) {return parse(src, "yyyy-MM-dd");}public static Date parseDatetime(String src) {return parse(src, "yyyy-MM-dd HH:mm:ss");}public static Date parse(String src, String pattern) {if (pattern == null) throw new IllegalArgumentException("日期格式不能为空");if (src == null) return null;try {return new SimpleDateFormat(pattern).parse(src);} catch (ParseException ex) {throw new IllegalArgumentException("日期格式转换出错,src=" + src + ",pattern=" + pattern);}}public static String formatDate(Date src) {return format(src, "yyyy-MM-dd");}public static String formatDatetime(Date src) {return format(src, "yyyy-MM-dd HH:mm:ss");}public static String format(Date src, String pattern) {if (pattern == null) throw new IllegalArgumentException("日期格式不能为空");if (src == null) return null;return new SimpleDateFormat(pattern).format(src);}public static int getLastDayOfMonth(int y, int m) {boolean IsLeapYear = (y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0);int days = 0;switch (m) {case 2:if (IsLeapYear) {days = 29;} else days = 28;break;case 4:case 6:case 9:case 11:days = 30;break;default:days = 31;break;}return days;}/*** 中文星期几** @return*/public static String getCnWeekDay() {return getCnWeekDay(new Date());}/*** 中文星期几** @return*/public static String getCnWeekDay(Date date) {String[] weekDays = {"日", "一", "二", "三", "四", "五", "六"};Calendar cal = Calendar.getInstance();cal.setTime(date);int w = cal.get(Calendar.DAY_OF_WEEK) - 1;if (w < 0) w = 0;return "星期" + weekDays[w];}/*** 获取当月的第一天* @return*/public static Date getFirstDateOfCurrentMonth() {Calendar instance = Calendar.getInstance();instance.setTime(new Date());int year = instance.get(Calendar.YEAR);int month = instance.get(Calendar.MONTH);instance.set(year, month, 1, 0, 0, 0);return instance.getTime();}public static Date getFirstDateOfCurrentYear() {Calendar instance = Calendar.getInstance();instance.setTime(new Date());int year = instance.get(Calendar.YEAR);instance.set(year, Calendar.JANUARY, 1, 0, 0, 0);return instance.getTime();}/*** 获取两个日期之间的天数(两个字符串)* @param smdate* @param bdate* @return* @throws ParseException*/public static int daysBetween(String smdate,String bdate) throws ParseException{SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");Calendar cal = Calendar.getInstance();cal.setTime(sdf.parse(smdate));long time1 = cal.getTimeInMillis();cal.setTime(sdf.parse(bdate));long time2 = cal.getTimeInMillis();long between_days=(time2-time1)/(1000*3600*24);return Integer.parseInt(String.valueOf(between_days));}/*** 获取两个日期之间的天数(字符串与date)* @param smdate* @param bdate* @return* @throws ParseException*/public static int daysBetween(String smdate,Date bdate) throws ParseException {SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");Calendar cal = Calendar.getInstance();cal.setTime(sdf.parse(smdate));long time1 = cal.getTimeInMillis();cal.setTime(bdate);long time2 = cal.getTimeInMillis();long between_days=(time2-time1)/(1000*3600*24);return Integer.parseInt(String.valueOf(between_days));}/*** 获取两个日期之间的天数(字符串与date)* @param smdate* @param bdate* @return* @throws ParseException*/public static int daysBetween(Date smdate, String bdate) throws ParseException {SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");Calendar cal = Calendar.getInstance();cal.setTime(sdf.parse(bdate));long time1 = cal.getTimeInMillis();cal.setTime(smdate);long time2 = cal.getTimeInMillis();long between_days=(time1-time2)/(1000*3600*24);return Integer.parseInt(String.valueOf(between_days));}/*** 将毫秒转化(转换成*天*小时*分钟*秒)* @param millis* @return* @throws ParseException*/public static String parse(long millis) throws ParseException {long days = millis / (1000 * 60 * 60 * 24);long hours = (millis % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);long minutes = (millis % (1000 * 60 * 60)) / (1000 * 60);long secs = (millis % (1000 * 60)) / (1000);String day = days==0l?"":days+"天";String hour = hours==0l?"":hours+"小时";String minute = minutes==0l?"":minutes+"分钟";String sec = secs==0l?"":secs+"秒";return day+hour+minute+sec;}public static void main(String[] args) {System.out.println(format(getFirstDateOfCurrentYear(), "yyyy-MM-dd HH:mm:ss"));}}