public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
private static final String DATE_PATTERN = "yyyy-MM-dd";
private static final String DATE_PATTERN2 = "dd/MM/yyyy";
private static final String COMPACT_DATE_PATTERN = "yyyyMMdd";
private static final String COMPACT_TIME_PATTERN = "HHmmss";
private static final String MM_TIME_PATTERN = "HH:mm";
private static final String TIME_PATTERN = "HH:mm:ss";
private static final String MIL_PATTERN = "HH:mm:ss:SSS";
private static final String TIME_PATTERN_WEEK = "yyyy-MM-dd E";
private static final String DATE_PATTERN_CN = "yyyy年MM月dd日";
private static final String DATE_PATTERN_AM_PM = "h:mma 'on' dd/MM/yyyy";
private static final String IOS8601_PATTERN = "'T'HH:mm:ss.SSS'Z'";
private DateUtils() {
}
private static int AGE_RANGE = 70;
public static Instant getTodayStartUTC() {
return LocalDateTime.of(LocalDate.now(ZoneOffset.UTC), LocalTime.of(0, 0, 0)).toInstant(ZoneOffset.UTC);
}
public static Instant getTodayEndUTC() {
return LocalDateTime.of(LocalDate.now(ZoneOffset.UTC), LocalTime.of(23, 59, 59)).toInstant(ZoneOffset.UTC);
}
public static Instant getDayStartUTC(String dateAsText, ZoneId zoneId) {
LocalDate localDate = LocalDate.parse(dateAsText, DateTimeFormatter.ofPattern(DATE_PATTERN));
return localDate.atStartOfDay().toInstant(ZoneOffset.UTC);
}
public static Instant getDayEndUTC(String dateAsText, ZoneId zoneId) {
LocalDateTime dateTime;
LocalDate localDate = LocalDate.parse(dateAsText, DateTimeFormatter.ofPattern(DATE_PATTERN));
LocalTime localTime = LocalTime.of(23, 59, 59);
dateTime = LocalDateTime.of(localDate, localTime);
ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, zoneId);
dateTime = LocalDateTime.ofInstant(zonedDateTime.toInstant(), ZoneOffset.UTC);
return dateTime.toInstant(ZoneOffset.UTC);
}
public static Date getUTCDate() {
return convertStringToDateTime(getUTCTime(DATE_PATTERN + " " + TIME_PATTERN));
}
public static String getUTCTime() {
return Instant.now().toString();
}
public static String getUTCTime(Date date) {
if (date == null) {
return null;
}
return date.toInstant().atZone(ZoneOffset.UTC).toString();
}
public static String getUTCTime(String format) {
LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.now(), ZoneOffset.UTC);
return dateTime.format(DateTimeFormatter.ofPattern(format));
}
public static String getUTCTime(Date date, String format) {
if (date == null) {
return null;
}
LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC);
return dateTime.format(DateTimeFormatter.ofPattern(format));
}
/**
* 微博日期格式.
* 一分钟之内用秒显示,如"4秒前";一个小时内用分钟显示,如"21分钟前";一天内用具体时间显示,如"13:25";当年内用月日显示,如"06月25日 13:25";往年用年月日显示
* ,如:"2010年5月20日"
* <p>
* 大于1天小于7天,显示X天前
*/
public static String formatDate(Date date) {
if (null == date) {
return "";
}
Calendar mb = Calendar.getInstance();
mb.setTime(date);
int mbMinute = mb.get(Calendar.MINUTE);
int mbHour = mb.get(Calendar.HOUR_OF_DAY);
int mbDate = mb.get(Calendar.DATE);
int mbMonth = mb.get(Calendar.MONTH);
int mbYear = mb.get(Calendar.YEAR);
Calendar cur = Calendar.getInstance();
if (cur.getTimeInMillis() < mb.getTimeInMillis()) {
cur.setTime(date);// 避免由于服务器时间不同步导致页面时间出现负数
}
int curMinute = cur.get(Calendar.MINUTE);
int curHour = cur.get(Calendar.HOUR_OF_DAY);
int curDate = cur.get(Calendar.DATE);
int curMonth = cur.get(Calendar.MONTH);
int curYear = cur.get(Calendar.YEAR);
if (curYear > mbYear) {// 往年
return new SimpleDateFormat("yyyy年MM月dd日").format(date);
}
if (mbYear == curYear) {// 当前年
if (mbMonth == curMonth && mbDate == curDate) {// 一天之内
if (mbHour == curHour) {// 一小时内
if (mbMinute == curMinute) {// 当前分钟
int sc = cur.get(Calendar.SECOND) - mb.get(Calendar.SECOND);
return (sc == 0 ? 2 : sc) + "秒前";// [KSSP-2681,Fuyx,2011-06-29]
}
return (cur.get(Calendar.MINUTE) - mb.get(Calendar.MINUTE)) + "分钟前";
}
return new SimpleDateFormat("HH:mm").format(date);
}
//一天前直接显示月日
// if (curMonth - mbMonth <= 1) {
// int days = cur.get(Calendar.DAY_OF_YEAR) - mb.get(Calendar.DAY_OF_YEAR);
// if (days < 7) {
// return days + "天前";
// }
// }
return new SimpleDateFormat("MM月dd日 HH:mm").format(date);
}
return "";
}
public static List<String> getChoiceYear() {
List<String> years = new ArrayList<String>();
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int limit = cal.get(Calendar.YEAR) - AGE_RANGE;
for (int year = cal.get(Calendar.YEAR) - 10; year > limit; year--) {
years.add(String.valueOf(year));
}
return years;
}
public static List<String> getChoiceMonth() {
List<String> months = new ArrayList<String>();
for (int i = 1; i < 13; i++) {
if (i < 10)
months.add("0" + String.valueOf(i));
else
months.add(String.valueOf(i));
}
return months;
}
public static List<String> getChoiceDay() {
List<String> days = new ArrayList<String>();
for (int i = 1; i < 32; i++) {
if (i < 10)
days.add("0" + String.valueOf(i));
else
days.add(String.valueOf(i));
}
return days;
}
public static Date getDate(String year, String month, String day) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, Integer.parseInt(year));
cal.set(Calendar.MONTH, Integer.parseInt(month) - 1);
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(day));
return cal.getTime();
}
public static String getYear(Date birthday) {
Calendar cal = Calendar.getInstance();
cal.setTime(birthday);
return String.valueOf(cal.get(Calendar.YEAR));
}
public static String getMonth(Date birthday, boolean isZero) {
Calendar cal = Calendar.getInstance();
cal.setTime(birthday);
int month = cal.get(Calendar.MONTH) + 1;
if (month < 10 && isZero)
return "0" + String.valueOf(month);
return String.valueOf(month);
}
public static String getDay(Date birthday, boolean isZero) {
Calendar cal = Calendar.getInstance();
cal.setTime(birthday);
int day = cal.get(Calendar.DAY_OF_MONTH);
if (day < 10 && isZero)
return "0" + String.valueOf(day);
return String.valueOf(day);
}
/**
* 获取当前日期的开始时间
*
* @return
*/
public static Date getNowDayBegin() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
return cal.getTime();
}
/**
* 获取当前日期的结束时间
*
* @return
*/
public static Date getNowDayEnd() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
return cal.getTime();
}
/**
* 获取N天前/后的开始时间
*
* @param day
* @return
*/
public static Date getDayBeginByDay(int day) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, day);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
return cal.getTime();
}
/**
* 获取N天前/后的结束时间
*
* @param day
* @return
*/
public static Date getDayEndByDay(int day) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, day);
cal.set(Calendar.HOUR, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
return cal.getTime();
}
public static Date string2Date(String s) {
return string2Date(s, "yyyy-MM-dd HH:mm:ss");
}
public static Date string2Date(String s, String pattern) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
Date d = null;
try {
d = sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return d;
}
/**
* 把传入的Date转化为"yyyy-mm-dd"的字符串
*
* @param day
* @return dayStr
*/
public static String date2String(Date day) {
return date2String(day, "yyyy-MM-dd");
}
public static String date2String(Date day, String pattern) {
if (null == day) return "";
return new SimpleDateFormat(StringUtils.isEmpty(pattern) ? "yyyy-MM-dd HH:mm:ss" : pattern).format(day);
}
/**
* 根据系统当前日期和员工加入公司日期计算出该员工工作年限
*
* @param date
* @return have worked years
*/
public static int workedYears(Date date) {
String joindate = DateUtils.date2String(date);
if (null == joindate || "".equalsIgnoreCase(joindate)) {
return 0;
}
int joinYear = Integer.parseInt(joindate.substring(0, 4));
int joinMonth = Integer.parseInt(joindate.substring(5, 7));
int joinDay = Integer.parseInt(joindate.substring(8, 10));
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
if (year <= joinYear) {
return 0;
}
return compareMonth(month, day, joinMonth, joinDay, year - joinYear);
}
public static int workedMonths(Date date) {
String joindate = DateUtils.date2String(date);
if (null == joindate || "".equalsIgnoreCase(joindate)) {
return 0;
}
int joinMonth = Integer.parseInt(joindate.substring(5, 7));
Calendar calendar = Calendar.getInstance();
int month = calendar.get(Calendar.MONTH) + 1;
if (month < joinMonth) {
return 12 - joinMonth + month;
} else {
return month - joinMonth;
}
}
public static int daysBetween(Date early, Date late) {
java.util.Calendar calst = java.util.Calendar.getInstance();
java.util.Calendar caled = java.util.Calendar.getInstance();
calst.setTime(early);
caled.setTime(late);
//设置时间为0时
calst.set(java.util.Calendar.HOUR_OF_DAY, 0);
calst.set(java.util.Calendar.MINUTE, 0);
calst.set(java.util.Calendar.SECOND, 0);
caled.set(java.util.Calendar.HOUR_OF_DAY, 0);
caled.set(java.util.Calendar.MINUTE, 0);
caled.set(java.util.Calendar.SECOND, 0);
//得到两个日期相差的天数 注:必须先除再减 否则会超过int类型的取值范围导致最高位符号位变成了1,经过强制转换会出现负数
int days = ((int) (caled.getTime().getTime() / 86400000) - (int) (calst
.getTime().getTime() / 86400000));
return days;
}
/**
* 计算今天 几号
*/
public static int getDateNum(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
return instance.get(Calendar.DATE);
}
/**
* 计算当前几月份
* @param date
* @return
*/
public static int getMonthNum(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
return instance.get(Calendar.MONTH + 1);
}
public static boolean isLastDayOfMonth(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DATE, (calendar.get(Calendar.DATE) + 1));
return calendar.get(Calendar.DAY_OF_MONTH) == 1;
}
public static int compareMonth(int month, int day, int joinMonth, int joinDay, int years) {
if (month - joinMonth < 0) {
return years - 1;
} else if (month - joinMonth > 0) {
return years;
} else {
if (day - joinDay < 0) {
return years - 1;
} else {
return years;
}
}
}
public static String addZero(String date) {
if (null == date) return "";
if (date.length() == 1) {
return "0" + date;
}
return date;
}
public static boolean isValidDate(String date, String pattern) {
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
dateFormat.setLenient(false);
try {
dateFormat.parse(date.trim());
} catch (ParseException pe) {
return false;
}
return true;
}
public static String getTimeString(Long millisecond) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(millisecond);
return (new SimpleDateFormat(DATE_PATTERN + " " + TIME_PATTERN)).format(calendar.getTime());
}
public static String convertDateToWeekString(Date aDate) {
return aDate == null ? null : (new SimpleDateFormat(TIME_PATTERN_WEEK)).format(aDate);
}
public static String convertDateToString(Date aDate, String pattern) {
return aDate == null ? null : (new SimpleDateFormat(pattern)).format(aDate);
}
public static String convertDateToString(Date aDate) {
return aDate == null ? null : (new SimpleDateFormat(DATE_PATTERN)).format(aDate);
}
public static String convertDateToStringFromTimeZone(Date aDate, String timeZone) {
TimeZone aDefault = TimeZone.getDefault();//原来的时区
TimeZone time = TimeZone.getTimeZone(timeZone); //设置为东八区 timeZone :+8/-8
TimeZone.setDefault(time);// 设置时区
Calendar calendar = Calendar.getInstance();// 获取实例
calendar.setTime(aDate);
aDate = calendar.getTime(); //获取Date对象
String s = new SimpleDateFormat(DATE_PATTERN, Locale.US).format(aDate).toLowerCase();
TimeZone.setDefault(aDefault);// 设置会原来的时区
return s;
}
public static String convertDateToAMPMString(Date aDate) {
return aDate == null ? null : (new SimpleDateFormat(DATE_PATTERN_AM_PM, Locale.US)).format(aDate).toLowerCase();
}
public static String convertDateToAMPMStringFromTimeZone(Date aDate, String timeZone) {
TimeZone aDefault = TimeZone.getDefault();//原来的时区
TimeZone time = TimeZone.getTimeZone(timeZone); //设置为东八区 timeZone : Hongkong
TimeZone.setDefault(time);// 设置时区
Calendar calendar = Calendar.getInstance();// 获取实例
calendar.setTime(aDate);
aDate = calendar.getTime(); //获取Date对象
String s = (new SimpleDateFormat(DATE_PATTERN_AM_PM, Locale.US)).format(aDate).toLowerCase();
TimeZone.setDefault(aDefault);// 设置会原来的时区
return s;
}
public static String convertDateToCnString(Date aDate) {
return format(aDate, DATE_PATTERN_CN);
}
public static Date convertStringToDate(String strDate) {
return parser(DATE_PATTERN, strDate);
}
public static Date convertString2ToDate(String strDate) {
return parser(DATE_PATTERN2, strDate);
}
public static String convertDateToCompactString(Date aDate) {
return format(aDate, COMPACT_DATE_PATTERN);
}
public static Date convertCompactStringToDate(String strDate) {
return parser(COMPACT_DATE_PATTERN, strDate);
}
public static String convertTimeToCompactString(Date aDate) {
return format(aDate, COMPACT_DATE_PATTERN + COMPACT_TIME_PATTERN);
}
public static Date convertCompactStringToTime(String strDate) {
return parser(COMPACT_DATE_PATTERN + COMPACT_TIME_PATTERN, strDate);
}
public static String convertMmTimeToString(Date aTime) {
return format(aTime, MM_TIME_PATTERN);
}
public static Date convertStringToMmTime(String strMmTime) {
return parser(MM_TIME_PATTERN, strMmTime);
}
public static String convertDateTimeToString(Date aDateTime) {
return format(aDateTime, DATE_PATTERN + " " + TIME_PATTERN);
}
public static String convertDateTimeToMilString(Date aDateTime) {
return format(aDateTime, DATE_PATTERN + " " + MIL_PATTERN);
}
public static String convertDateTimeToMmString(Date aDateTime) {
return format(aDateTime, DATE_PATTERN + " " + MM_TIME_PATTERN);
}
public static Date convertMmStringToDateTime(String strMmDateTime) {
return parser(DATE_PATTERN + " " + MM_TIME_PATTERN, strMmDateTime);
}
public static Date convertStringToDateTime(String strDateTime) {
return parser(DATE_PATTERN + " " + TIME_PATTERN, strDateTime);
}
public static String convertDateTimeToIso8601String(Date aDateTime) {
return format(aDateTime, DATE_PATTERN + IOS8601_PATTERN);
}
public static Date convertIso8601StringToDateTime(String strDateTime) {
return parser(DATE_PATTERN + IOS8601_PATTERN, strDateTime);
}
public static Date convertStringToDateTime(String datePattern, String strDateTime) {
return parser(datePattern, strDateTime);
}
private static Date parser(String pattern, String dateString) {
try {
return new SimpleDateFormat(pattern).parse(dateString);
} catch (ParseException e) {
throw new ParseDateException(e);
}
}
private static String format(Date date, String pattern) {
try {
return new SimpleDateFormat(pattern).format(date);
} catch (Exception e) {
throw new ParseDateException(e);
}
}
/* ----------------------------- 以下是日期运算方法 --------------------------- */
public static Date getMonthEndTime(Calendar calendar) {
Calendar tmpCalendar = (Calendar) calendar.clone();
tmpCalendar.set(Calendar.DAY_OF_MONTH, 1);
tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
tmpCalendar.set(Calendar.MINUTE, 0);
tmpCalendar.set(Calendar.SECOND, 0);
tmpCalendar.set(Calendar.MILLISECOND, 0);
tmpCalendar.add(Calendar.MONTH, 1);
tmpCalendar.add(Calendar.MILLISECOND, -1);
return tmpCalendar.getTime();
}
public static Date getMonthEndTime(int year, int month) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
return getMonthEndTime(calendar);
}
public static Date getMonthEndTime(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return getMonthEndTime(calendar);
}
public static Date getMonthStartTime(int year, int month) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
return getMonthStartTime(calendar);
}
public static Date getMonthStartTime(Calendar calendar) {
Calendar tmpCalendar = (Calendar) calendar.clone();
tmpCalendar.set(Calendar.DAY_OF_MONTH, 1);
tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
tmpCalendar.set(Calendar.MINUTE, 0);
tmpCalendar.set(Calendar.SECOND, 0);
tmpCalendar.set(Calendar.MILLISECOND, 0);
return tmpCalendar.getTime();
}
public static Date getMonthStartTime(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return getMonthStartTime(calendar);
}
public static Date getDayEndTime(Calendar calendar) {
Calendar tmpCalendar = (Calendar) calendar.clone();
tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
tmpCalendar.set(Calendar.MINUTE, 0);
tmpCalendar.set(Calendar.SECOND, 0);
tmpCalendar.set(Calendar.MILLISECOND, 0);
tmpCalendar.add(Calendar.DATE, 1);
tmpCalendar.add(Calendar.MILLISECOND, -1);
return tmpCalendar.getTime();
}
public static Date getDayEndTime(int year, int month, int day) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.DAY_OF_MONTH, day);
return getDayEndTime(calendar);
}
public static Date getDayEndTime(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return getDayEndTime(calendar);
}
public static Date getDayEndTime(String date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(DateUtils.convertStringToDateTime(DATE_PATTERN, date));
return getDayEndTime(calendar);
}
public static Date getDayStartTime(int year, int month, int day) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.DAY_OF_MONTH, day);
return getDayStartTime(calendar);
}
public static Date getDayStartTime(Calendar calendar) {
Calendar tmpCalendar = (Calendar) calendar.clone();
tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
tmpCalendar.set(Calendar.MINUTE, 0);
tmpCalendar.set(Calendar.SECOND, 0);
tmpCalendar.set(Calendar.MILLISECOND, 0);
return tmpCalendar.getTime();
}
public static Date getDayStartTime(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return getDayStartTime(calendar);
}
public static Date getDayStartTime(String date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(DateUtils.convertStringToDateTime(DATE_PATTERN, date));
return getDayStartTime(calendar);
}
public static Date getWeekStartTime(Calendar calendar) {
Calendar tmpCalendar = (Calendar) calendar.clone();
tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
tmpCalendar.set(Calendar.MINUTE, 0);
tmpCalendar.set(Calendar.SECOND, 0);
tmpCalendar.set(Calendar.MILLISECOND, 0);
tmpCalendar.setFirstDayOfWeek(Calendar.MONDAY);
tmpCalendar.set(Calendar.DAY_OF_WEEK, tmpCalendar.getFirstDayOfWeek());
return tmpCalendar.getTime();
}
public static Date getWeekStartTime(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return getWeekStartTime(calendar);
}
public static Date getWeekEndTime(Calendar calendar) {
Calendar tmpCalendar = (Calendar) calendar.clone();
tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
tmpCalendar.set(Calendar.MINUTE, 0);
tmpCalendar.set(Calendar.SECOND, 0);
tmpCalendar.set(Calendar.MILLISECOND, 0);
tmpCalendar.setFirstDayOfWeek(Calendar.MONDAY);
tmpCalendar.set(Calendar.DAY_OF_WEEK, tmpCalendar.getFirstDayOfWeek());
tmpCalendar.add(Calendar.DATE, 7);
tmpCalendar.set(Calendar.MILLISECOND, -1);
return tmpCalendar.getTime();
}
public static Date getWeekEndTime(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return getWeekEndTime(calendar);
}
public static Date getNextMonthDate(int nextMonthDate) {
Calendar instance = Calendar.getInstance();
instance.add(Calendar.MONTH, 1);
instance.set(Calendar.DATE, nextMonthDate);
return instance.getTime();
}
public static Date getCurrentMonthDate(int currentMonthDate) {
Calendar instance = Calendar.getInstance();
instance.set(Calendar.DATE, currentMonthDate);
return instance.getTime();
}
//---------------------------------------------------------
public static Date getCurentWeekStartTime() {
return getWeekStartTime(new Date());
}
public static Date getCurentWeekEndTime() {
return getWeekEndTime(new Date());
}
public static Date getCurentMonthStartTime() {
return getMonthStartTime(new Date());
}
public static Date getCurentMonthEndTime() {
return getMonthEndTime(new Date());
}
public static int getFromYear(Date fromDate, Date toDate) {
Calendar fromCalendar = Calendar.getInstance();
fromCalendar.setTime(fromDate);
Calendar now = Calendar.getInstance();
now.setTime(toDate);
int day = now.get(Calendar.DAY_OF_MONTH) - fromCalendar.get(Calendar.DAY_OF_MONTH);
int month = now.get(Calendar.MONTH) - fromCalendar.get(Calendar.MONTH);
int year = now.get(Calendar.YEAR) - fromCalendar.get(Calendar.YEAR);
//按照减法原理,先day相减,不够向month借;然后month相减,不够向year借;最后year相减。
if(day<0){
month -= 1;
now.add(Calendar.MONTH, -1);//得到上一个月,用来得到上个月的天数。
}
if(month<0){
year--;
}
return year;
}
public static int getFromMonth(Date fromDate, Date toDate) {
Calendar fromCalendar = Calendar.getInstance();
fromCalendar.setTime(fromDate);
Calendar now = Calendar.getInstance();
now.setTime(toDate);
int day = now.get(Calendar.DAY_OF_MONTH) - fromCalendar.get(Calendar.DAY_OF_MONTH);
int month = now.get(Calendar.MONTH) - fromCalendar.get(Calendar.MONTH);
//按照减法原理,先day相减,不够向month借;然后month相减,不够向year借;最后year相减。
if(day<0){
month -= 1;
now.add(Calendar.MONTH, -1);//得到上一个月,用来得到上个月的天数。
}
if(month<0){
month = (month+12)%12;
}
return month;
}
public static String getLastMonthLastDay() {
Calendar c=Calendar.getInstance();
c.add(Calendar.MONTH, -1);
int lastMonthMaxDay=c.getActualMaximum(Calendar.DAY_OF_MONTH);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), lastMonthMaxDay);
// date format
String gtime = sdf.format(c.getTime()); // last Month last day
return gtime;
}
public static String getLastMonthFirstDay() {
Calendar c=Calendar.getInstance();
c.add(Calendar.MONTH, -1);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-01");
String gtime2 = sdf2.format(c.getTime()); // last Month first day
return gtime2;
}
public static String getCurrentMonthCurrentDay() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String currentDate = sdf.format(new Date());
return currentDate;
}
public static String getCurrentMonthFirstDay() {
Calendar c=Calendar.getInstance();
c.add(Calendar.MONTH, 0);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-01");
String gtime2 = sdf2.format(c.getTime()); // current Month first day
return gtime2;
}
/**
* 计算两个日期之间相差的分钟数
* @param startTime
* @param endTime
* @return
*/
public static long dateDiffMins(Date startTime, Date endTime) {
if (startTime == null || endTime == null || (startTime.compareTo(endTime) >= 0)) {
return 0l;
}
long nd = 1000 * 24 * 60 * 60;// ms in one day
long nh = 1000 * 60 * 60;// ms in one hour
double nm = 1000 * 60d;// ms in one minute
long diff;
long day = 0;
long hour = 0;
long min = 0;
diff = endTime.getTime() - startTime.getTime();
day = diff / nd; // different days
hour = diff % nd / nh; // different hours
min = (long)(Math.ceil(diff % nd % nh / nm) + hour * 60 + day * 24 * 60);// different minutes
return min;
}
}
public class LocalDateUtils {
public static final String DATE_PATTERN = "yyyy-MM-dd";
public static final String DATE_PATTERN2 = "dd/MM/yyyy";
public static final String COMPACT_DATE_PATTERN = "yyyyMMdd";
public static final String COMPACT_TIME_PATTERN = "HHmmss";
public static final String MM_TIME_PATTERN = "HH:mm";
public static final String TIME_PATTERN = "HH:mm:ss";
public static final String MIL_PATTERN = "HH:mm:ss:SSS";
public static final String TIME_PATTERN_WEEK = "yyyy-MM-dd E";
public static final String DATE_PATTERN_CN = "yyyy年MM月dd日";
public static final String DATE_PATTERN_AM_PM = "h:mma 'on' dd/MM/yyyy";
public static final String IOS8601_PATTERN = "'T'HH:mm:ss.SSS'Z'";
public static final String ZONED_DATE_PATTERN = "'T'HH:mm:ssXXX";
public static final String ZONED_MIL_PATTERN = "'T'HH:mm:ss.SSSXXX";
public static final String LOCAL_DATE_PATTERN = "'T'HH:mm:ss";
private static final int NANO_OF_SECOND = 999999999;
private LocalDateUtils() {
}
private static int AGE_RANGE = 70;
public static Instant getTodayStartUTC() {
return LocalDateTime.of(LocalDate.now(ZoneOffset.UTC), LocalTime.of(0, 0, 0)).toInstant(ZoneOffset.UTC);
}
public static Instant getTodayEndUTC() {
return LocalDateTime.of(LocalDate.now(ZoneOffset.UTC), LocalTime.of(23, 59, 59)).toInstant(ZoneOffset.UTC);
}
public static Instant getDayStartUTC(String dateAsText, ZoneId zoneId) {
LocalDateTime dateTime;
LocalDate localDate = LocalDate.parse(dateAsText, DateTimeFormatter.ofPattern(DATE_PATTERN));
LocalTime localTime = LocalTime.of(0, 0, 0);
dateTime = LocalDateTime.of(localDate, localTime);
ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, zoneId);
dateTime = LocalDateTime.ofInstant(zonedDateTime.toInstant(), ZoneOffset.UTC);
return dateTime.toInstant(ZoneOffset.UTC);
}
public static Instant getDayEndUTC(String dateAsText, ZoneId zoneId) {
LocalDateTime dateTime;
LocalDate localDate = LocalDate.parse(dateAsText, DateTimeFormatter.ofPattern(DATE_PATTERN));
LocalTime localTime = LocalTime.of(23, 59, 59);
dateTime = LocalDateTime.of(localDate, localTime);
ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, zoneId);
dateTime = LocalDateTime.ofInstant(zonedDateTime.toInstant(), ZoneOffset.UTC);
return dateTime.toInstant(ZoneOffset.UTC);
}
public static String getTime(LocalDateTime dateTime, String format) {
if (dateTime == null) {
return null;
}
return dateTime.format(DateTimeFormatter.ofPattern(format));
}
/**
* 获取当前日期的开始时间
*
* @return
*/
public static LocalDateTime getNowDayBegin() {
LocalDateTime now = LocalDateTime.now();
return now.withHour(0).withMinute(0).withSecond(0);
}
/**
* 获取当前日期的结束时间
*
* @return
*/
public static LocalDateTime getNowDayEnd() {
LocalDateTime now = LocalDateTime.now();
return now.withHour(23).withMinute(59).withSecond(59);
}
/**
* 获取N天前/后的开始时间
*
* @param day
* @return
*/
public static LocalDateTime getDayBeginByDay(int day) {
return getNowDayBegin().minusDays(day);
}
/**
* 获取N天前/后的结束时间
*
* @param day
* @return
*/
public static LocalDateTime getDayEndByDay(int day) {
return getNowDayEnd().minusDays(day);
}
public static LocalDateTime string2Date(String s) {
return stringToDate(s, "yyyy-MM-dd HH:mm:ss");
}
/**
* 把传入的Date转化为"yyyy-mm-dd"的字符串
*
* @param day
* @return dayStr
*/
public static String dateToString(LocalDateTime day) {
return dateToString(day, "yyyy-MM-dd");
}
public static LocalDateTime stringToDate(String s, String pattern) {
DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
return LocalDateTime.parse(s,df);
}
public static String dateToString(LocalDateTime day, String pattern) {
if (null == day) return "";
return day.format(DateTimeFormatter.ofPattern(StringUtils.isEmpty(pattern) ? "yyyy-MM-dd HH:mm:ss" : pattern));
}
/**
* 根据系统当前日期和员工加入公司日期计算出该员工工作年限
*
* @param date
* @return have worked years
*/
public static int workedYears(LocalDateTime date) {
if (date == null){
return 0;
}
int joinYear = date.getYear();
int joinMonth = date.getMonthValue();
int joinDay = date.getDayOfMonth();
LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
if (year <= joinYear) {
return 0;
}
return compareMonth(month, day, joinMonth, joinDay, year - joinYear);
}
public static int workedMonths(LocalDateTime date) {
if (date == null){
return 0;
}
int joinMonth = date.getMonthValue();
LocalDateTime now = LocalDateTime.now();
int month = now.getMonthValue();
if (month < joinMonth) {
return 12 - joinMonth + month;
} else {
return month - joinMonth;
}
}
public static int daysBetween(LocalDateTime early, LocalDateTime late) {
//设置时间为0时
LocalDate earlyDate = early.toLocalDate();
LocalDate lateDate = late.toLocalDate();
Long days = lateDate.toEpochDay() - earlyDate.toEpochDay();
return days.intValue();
}
public static int compareMonth(int month, int day, int joinMonth, int joinDay, int years) {
if (month - joinMonth < 0) {
return years - 1;
} else if (month - joinMonth > 0) {
return years;
} else {
if (day - joinDay < 0) {
return years - 1;
} else {
return years;
}
}
}
/* ----------------------------- 日期字符串转换方法 start --------------------------- */
public static String defaultInstantToString(Instant day) {
return instantToString(day,DATE_PATTERN + ZONED_DATE_PATTERN);
}
public static String defaultZonedDateTimeToString(ZonedDateTime day){
return zonedDateTimeToString(day, DATE_PATTERN + ZONED_DATE_PATTERN);
}
public static String defaultLocalDateTimeToString(LocalDateTime day){
return localDateTimeToString(day, DATE_PATTERN + LOCAL_DATE_PATTERN);
}
public static String defaultLocalDateToString(LocalDate day){
return localDateToString(day, DATE_PATTERN);
}
public static String defaultLocalTimeToString(LocalTime day){
return localTimeToString(day, TIME_PATTERN);
}
public static String instantToString(Instant day, String pattern) {
return null == day || StringUtils.isEmpty(pattern) ? null :zonedDateTimeToString(day.atZone(ZoneId.systemDefault()),pattern);
}
public static String zonedDateTimeToString(ZonedDateTime day, String pattern) {
return null == day || StringUtils.isEmpty(pattern) ? null : day.format(DateTimeFormatter.ofPattern(pattern));
}
public static String localDateTimeToString(LocalDateTime day, String pattern) {
return null == day ? null : day.format(DateTimeFormatter.ofPattern(pattern));
}
public static String localDateToString(LocalDate day, String pattern) {
return null == day || StringUtils.isEmpty(pattern) ? null : day.format(DateTimeFormatter.ofPattern(pattern));
}
public static String localTimeToString(LocalTime day, String pattern) {
return null == day || StringUtils.isEmpty(pattern) ? null : day.format(DateTimeFormatter.ofPattern(pattern));
}
public static Instant defaultStringToInstant(String s){
return stringToInstant(s,DATE_PATTERN + ZONED_DATE_PATTERN);
}
public static ZonedDateTime defaultStringToZonedDateTime(String s){
return stringToZonedDateTime(s,DATE_PATTERN + ZONED_DATE_PATTERN);
}
public static LocalDateTime defaultStringToLocalDateTime(String s){
return stringToLocalDateTime(s,DATE_PATTERN + LOCAL_DATE_PATTERN);
}
public static LocalDate defaultStringToLocalDate(String s){
return stringToLocalDate(s,DATE_PATTERN);
}
public static LocalTime defaultStringToLocalTime(String s){
return stringToLocalTime(s,TIME_PATTERN);
}
public static Instant stringToInstant(String s, String pattern){
return StringUtils.isEmpty(pattern) ? null : ZonedDateTime.parse(s,DateTimeFormatter.ofPattern(pattern)).toInstant();
}
public static ZonedDateTime stringToZonedDateTime(String s, String pattern){
return StringUtils.isEmpty(pattern) ? null : ZonedDateTime.parse(s,DateTimeFormatter.ofPattern(pattern));
}
public static LocalDateTime stringToLocalDateTime(String s, String pattern){
return StringUtils.isEmpty(pattern) ? null : LocalDateTime.parse(s,DateTimeFormatter.ofPattern(pattern));
}
public static LocalDate stringToLocalDate(String s, String pattern){
return StringUtils.isEmpty(pattern) ? null : LocalDate.parse(s,DateTimeFormatter.ofPattern(pattern));
}
public static LocalTime stringToLocalTime(String s, String pattern){
return StringUtils.isEmpty(pattern) ? null : LocalTime.parse(s,DateTimeFormatter.ofPattern(pattern));
}
//旧的方法 start
public static String convertDateToWeekString(LocalDateTime aDate) {
return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(TIME_PATTERN_WEEK));
}
public static String convertDateToString(LocalDateTime aDate, String pattern) {
return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(pattern));
}
public static String convertDateToString(LocalDateTime aDate) {
return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(DATE_PATTERN));
}
public static String convertDateToAMPMString(LocalDateTime aDate) {
return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(DATE_PATTERN_AM_PM, Locale.US));
}
public static String convertDateToCnString(LocalDateTime aDate) {
return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(DATE_PATTERN_CN));
}
public static LocalDate convertStringToDate(String strDate) {
return LocalDate.parse(strDate,DateTimeFormatter.ofPattern(DATE_PATTERN));
}
public static LocalDateTime convertString2ToDate(String strDate) {
return LocalDateTime.parse(strDate,DateTimeFormatter.ofPattern(DATE_PATTERN2));
}
public static String convertDateToCompactString(LocalDateTime aDate) {
return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(COMPACT_DATE_PATTERN));
}
public static LocalDateTime convertCompactStringToDate(String strDate) {
return LocalDateTime.parse(strDate,DateTimeFormatter.ofPattern(COMPACT_DATE_PATTERN));
}
public static String convertTimeToCompactString(LocalDateTime aDate) {
return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(COMPACT_DATE_PATTERN + COMPACT_TIME_PATTERN));
}
public static LocalDateTime convertCompactStringToTime(String strDate) {
return LocalDateTime.parse(strDate,DateTimeFormatter.ofPattern(COMPACT_DATE_PATTERN + COMPACT_TIME_PATTERN));
}
public static String convertMmTimeToString(LocalDateTime aTime) {
return aTime == null ? null : aTime.format(DateTimeFormatter.ofPattern(MM_TIME_PATTERN));
}
public static LocalDateTime convertStringToMmTime(String strMmTime) {
return LocalDateTime.parse(strMmTime,DateTimeFormatter.ofPattern(MM_TIME_PATTERN));
}
public static String convertDateTimeToString(LocalDateTime aDateTime) {
return aDateTime == null ? null : aDateTime.format(DateTimeFormatter.ofPattern( DATE_PATTERN + " " + TIME_PATTERN));
}
public static String convertDateTimeToMilString(LocalDateTime aDateTime) {
return aDateTime == null ? null : aDateTime.format(DateTimeFormatter.ofPattern(DATE_PATTERN + " " + MIL_PATTERN));
}
public static String convertDateTimeToMmString(LocalDateTime aDateTime) {
return aDateTime == null ? null : aDateTime.format(DateTimeFormatter.ofPattern(DATE_PATTERN + " " + MM_TIME_PATTERN));
}
public static LocalDateTime convertMmStringToDateTime(String strMmDateTime) {
return LocalDateTime.parse(strMmDateTime,DateTimeFormatter.ofPattern(DATE_PATTERN + " " + MM_TIME_PATTERN));
}
public static LocalDateTime convertStringToDateTime(String strDateTime) {
return LocalDateTime.parse(strDateTime,DateTimeFormatter.ofPattern(DATE_PATTERN + " " + TIME_PATTERN));
}
public static String convertDateTimeToIso8601String(LocalDateTime aDateTime) {
return aDateTime == null ? null : aDateTime.format(DateTimeFormatter.ofPattern(DATE_PATTERN + IOS8601_PATTERN));
}
public static LocalDateTime convertIso8601StringToDateTime(String strDateTime) {
return LocalDateTime.parse(strDateTime,DateTimeFormatter.ofPattern(DATE_PATTERN + IOS8601_PATTERN));
}
public static LocalDateTime convertStringToDateTime(String datePattern, String strDateTime) {
return LocalDateTime.parse(strDateTime,DateTimeFormatter.ofPattern(datePattern));
}
//旧的方法 end
/* ----------------------------- 日期字符串转换方法 end --------------------------- */
/* ----------------------------- Object转日期类型方法 start --------------------------- */
//判断时间类型
public static Class getDateType(String day){
if (day.indexOf("-") == -1){
return LocalTime.class;
}else if (day.length() == LocalDateUtils.DATE_PATTERN.length()){
return LocalDate.class;
}else {
if (day.indexOf("Z") != -1 || day.indexOf("+") != -1 || day.lastIndexOf("-") > 7){
return ZonedDateTime.class;
}else {
return LocalDateTime.class;
}
}
}
//其他时间类型转LocalDate
public static LocalDate convertObjToLocalDate(Object day){
Class dateType = getDateType(day.toString());
if (dateType == LocalDate.class){
return castToLocalDate(day);
}else if (dateType == ZonedDateTime.class){
return castToZonedDateTime(day).toLocalDate();
}else if (dateType == LocalDateTime.class){
return castToLocalDateTime(day).toLocalDate();
}else if (dateType == Instant.class){
return castToInstant(day).atZone(ZoneId.systemDefault()).toLocalDate();
}
return null;
}
public static <T> T castToDate(Object obj, Class<T> clazz){
if (clazz == LocalDate.class){
return (T) castToLocalDate(obj);
}else if (clazz == ZonedDateTime.class){
return (T) castToZonedDateTime(obj);
}else if (clazz == LocalDateTime.class){
return (T) castToLocalDateTime(obj);
}else if (clazz == Instant.class){
return (T) castToInstant(obj);
}else if (clazz == LocalTime.class){
return (T) castToLocalTime(obj);
}
return null;
}
public static LocalDateTime castToLocalDateTime(Object day){
if (day instanceof LocalDateTime){
return (LocalDateTime) day;
}else if (day instanceof String){
return stringToLocalDateTime((String) day,DATE_PATTERN+LOCAL_DATE_PATTERN);
}else if (day instanceof Long){
return LocalDateTime.ofInstant(Instant.ofEpochMilli((Long) day ), ZoneId.systemDefault());
}
return null;
}
public static LocalDate castToLocalDate(Object day){
if (day instanceof LocalDate){
return (LocalDate) day;
}else if (day instanceof String){
if (((String) day).indexOf("-") != -1){
return stringToLocalDate((String) day,DATE_PATTERN);
}
return stringToLocalDate((String) day,COMPACT_DATE_PATTERN);
}
return null;
}
public static LocalTime castToLocalTime(Object day){
if (day instanceof LocalTime){
return (LocalTime) day;
}else if (day instanceof String){
return stringToLocalTime((String) day,TIME_PATTERN);
}
return null;
}
public static ZonedDateTime castToZonedDateTime(Object day){
if (day instanceof ZonedDateTime){
return (ZonedDateTime) day;
}else if (day instanceof String){
// yyyy-MM-dd'T'HH:mm:ssX , yyyy-MM-dd'T'HH:mm:ss.SSSX
return stringToZonedDateTime((String) day,getFormat((String) day));
}
return null;
}
public static Instant castToInstant(Object day){
if (day instanceof Instant){
return (Instant) day;
}else if (day instanceof String){
return stringToInstant((String) day,getFormat((String) day));
}
return null;
}
private static String getFormat(String s){
if (s.indexOf(".")==-1){
return DATE_PATTERN+ZONED_DATE_PATTERN;
}else {
return DATE_PATTERN+ZONED_MIL_PATTERN;
}
}
/* ----------------------------- Object转日期类型方法 end --------------------------- */
/* ----------------------------- 以下是日期运算方法 --------------------------- */
public static int getFromYear(LocalDateTime fromDate, LocalDateTime toDate) {
int day = toDate.getDayOfMonth() - fromDate.getDayOfMonth();
int month = toDate.getMonthValue() - fromDate.getMonthValue();
int year = toDate.getYear() - fromDate.getYear();
//按照减法原理,先day相减,不够向month借;然后month相减,不够向year借;最后year相减。
if(day<0){
month -= 1;
}
if(month<0){
year--;
}
return year;
}
public static int getFromMonth(LocalDateTime fromDate, LocalDateTime toDate) {
int day = toDate.getDayOfMonth() - fromDate.getDayOfMonth();
int month = toDate.getMonthValue() - fromDate.getMonthValue();
//按照减法原理,先day相减,不够向month借;然后month相减,不够向year借;最后year相减。
if(day<0){
month -= 1;
}
if(month<0){
month = (month+12)%12;
}
return month;
}
public static String getLastMonthLastDay() {
LocalDateTime now = LocalDateTime.now();
int i = now.getMonthValue() - 1;
if (i<=0){
now = now.withMonth(12).withYear(now.getYear()-1);
}else {
now = now.withMonth(now.getMonthValue() - 1);
}
return now.with(TemporalAdjusters.lastDayOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
public static String getLastMonthFirstDay() {
LocalDateTime now = LocalDateTime.now();
int i = now.getMonthValue() - 1;
if (i<=0){
now = now.withMonth(12).withYear(now.getYear()-1);
}else {
now = now.withMonth(now.getMonthValue() - 1);
}
return now.format(DateTimeFormatter.ofPattern("yyyy-MM-01"));
}
public static String getCurrentMonthCurrentDay() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
public static String getCurrentMonthFirstDay() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-01"));
}
public static LocalDateTime getMonthStartTime(LocalDateTime date) {
return date.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
}
public static LocalDateTime getMonthEndTime(LocalDateTime date) {
return date.withHour(23).withMinute(59).withSecond(59).withNano(NANO_OF_SECOND).with(TemporalAdjusters.lastDayOfMonth());
}
public static LocalDateTime getCurentMonthStartTime() {
return getMonthStartTime(LocalDateTime.now());
}
/**
* 计算两个日期之间相差的分钟数
* @param startTime
* @param endTime
* @return
*/
public static long dateDiffMins(LocalDateTime startTime, LocalDateTime endTime) {
if (startTime == null || endTime == null || (startTime.compareTo(endTime) >= 0)) {
return 0l;
}
long nd = 1000 * 24 * 60 * 60;// ms in one day
long nh = 1000 * 60 * 60;// ms in one hour
double nm = 1000 * 60d;// ms in one minute
long diff;
long day = 0;
long hour = 0;
long min = 0;
long endMilli = endTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
long startMilli = startTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
diff = endMilli - startMilli;
day = diff / nd; // different days
hour = diff % nd / nh; // different hours
min = (long)(Math.ceil(diff % nd % nh / nm) + hour * 60 + day * 24 * 60);// different minutes
return min;
}
}