import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MiDateUtil {
public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
public static final String DEFAULT_YEARMONTH_FORMAT = "yyyy-MM";
public static final String FORMAT_YYYY = "yyyy";
public static final String FORMAT_YYYYMM = "yyyyMM";
public static final String FORMAT_YYYYMMDD = "yyyyMMdd";
public static final String START_HHMMSS = " 00:00:00";
public static final String END_HHMMSS = " 23:59:59";
public static void main(String[] args) {
log.info("月 开始时间:" + getFirstDayOfMonth(2018, 1));
log.info("月 结束时间:" + getLastDayOfMonth(2018, 1));
log.info("周 开始时间:" + getStartDayOfWeekNo(2018, 52));
log.info("周 结束时间:" + getEndDayOfWeekNo(2018, 52));
log.info("季 开始时间:" + getStartDayOfSeason(2019, 4));
log.info("季 结束时间:" + getEndDayOfSeason(2019, 4));
log.info("-------------------------");
log.info("周 开始时间:" + getStartDayOfWeekNo(2018, 52, false));
log.info("周 结束时间:" + getEndDayOfWeekNo(2018, 52, false));
log.info("季 开始时间:" + getStartDayOfSeason(2019, 4, false));
log.info("季 结束时间:" + getEndDayOfSeason(2019, 4, false));
}
/**
* 根据某年某月得到最后一天
*
* @param year 年
* @param month 月
* @return
*/
public static String getLastDayOfMonth(int year, int month) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month - 1);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DATE));
return formatDate(cal.getTime());
}
/**
* 根据某年某月得到第一天
*
* @param year 年
* @param month 月
* @return
*/
public static String getFirstDayOfMonth(int year, int month) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month - 1);
cal.set(Calendar.DAY_OF_MONTH, cal.getMinimum(Calendar.DATE));
return formatDate(cal.getTime());
}
/**
* 根据某年第几周得到结束日期
*
* @param year 年
* @param weekNo 第几周
* @return
*/
public static String getEndDayOfWeekNo(int year, int weekNo) {
return getEndDayOfWeekNo(year, weekNo, true);
}
/**
* 根据某年第几周得到结束日期
*
* @param year 年
* @param weekNo 第几周
* @param hms 是否添加时分秒
* @return
*/
public static String getEndDayOfWeekNo(int year, int weekNo, boolean hms) {
Calendar cal = getCalendarFormYear(year);
cal.set(Calendar.WEEK_OF_YEAR, weekNo);
cal.add(Calendar.DAY_OF_WEEK, 6);
return hms ? formatDate(cal.getTime()) + END_HHMMSS : formatDate(cal.getTime());
}
/**
* 根据某年第几周得到开始日期
*
* @param year 年
* @param weekNo 第几周
* @return
*/
public static String getStartDayOfWeekNo(int year, int weekNo) {
return getStartDayOfWeekNo(year, weekNo, true);
}
/**
* 根据某年第几周得到开始日期
*
* @param year 年
* @param weekNo 第几周
* @param hms 是否添加时分秒
* @return
*/
public static String getStartDayOfWeekNo(int year, int weekNo, boolean hms) {
Calendar cal = getCalendarFormYear(year);
cal.set(Calendar.WEEK_OF_YEAR, weekNo);
return hms ? formatDate(cal.getTime()) + START_HHMMSS : formatDate(cal.getTime());
}
private static Calendar getCalendarFormYear(int year) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.set(Calendar.YEAR, year);
return cal;
}
/**
* 根据某年第几季得到开始日期
*
* @param year 年
* @param season 第几季(1,2,3,4)
* @return
*/
public static String getStartDayOfSeason(int year, int season) {
return getStartDayOfSeason(year, season, true);
}
/**
* 根据某年第几季得到开始日期
*
* @param year 年
* @param season 第几季(1,2,3,4)
* @param hms 是否添加时分秒
* @return
*/
public static String getStartDayOfSeason(int year, int season, boolean hms) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
if (season == 1) {
cal.set(Calendar.MONTH, 0);
} else if (season == 2) {
cal.set(Calendar.MONTH, 3);
} else if (season == 3) {
cal.set(Calendar.MONTH, 6);
} else if (season == 4) {
cal.set(Calendar.MONTH, 9);
}
cal.set(Calendar.DATE, 1);
return hms ? formatDate(cal.getTime()) + START_HHMMSS : formatDate(cal.getTime());
}
/**
* 根据某年第几季得到结束日期
*
* @param year 年
* @param season 第几季(1,2,3,4)
* @return
*/
public static String getEndDayOfSeason(int year, int season) {
return getEndDayOfSeason(year, season, true);
}
/**
* 根据某年第几季得到结束日期
*
* @param year 年
* @param season 第几季(1,2,3,4)
* @param hms 是否添加时分秒
* @return
*/
public static String getEndDayOfSeason(int year, int season, boolean hms) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
if (season == 1) {
cal.set(Calendar.MONTH, 2);
} else if (season == 2) {
cal.set(Calendar.MONTH, 5);
} else if (season == 3) {
cal.set(Calendar.MONTH, 8);
} else if (season == 4) {
cal.set(Calendar.MONTH, 11);
}
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DATE));
return hms ? formatDate(cal.getTime()) + END_HHMMSS : formatDate(cal.getTime());
}
/**
* 根据传入的年、月、日设置指定时间
*
* @param year
* @param month
* @param day
* @return
*/
public static Date setDate(Integer year, Integer month, Integer day) {
Calendar calendar = Calendar.getInstance();
if (year != null) {
calendar.set(Calendar.YEAR, year);
}
if (month != null) {
calendar.set(Calendar.MONTH, month - 1);
}
if (day != null) {
calendar.set(Calendar.DAY_OF_MONTH, day);
}
return calendar.getTime();
}
/**
* 使用指定格式将日期转换为它的字符串表示形式。
*
* @param date 日期,非 null。
* @param format 指定返回格式的字符串。
* @return 日期的字符串表示形式。
*/
public static String format(Date date, String format) {
if (date == null) {
return null;
}
return new SimpleDateFormat(format).format(date);
}
public static String formatDate(Date date) {
return format(date, DEFAULT_DATE_FORMAT);
}
public static String formatDateTime(Date date) {
return format(date, DEFAULT_DATETIME_FORMAT);
}
/**
* 使用指定格式将日期字符串转换为时间。
*
* @param dateStr 日期字符串,非 null。
* @param format 指定日期字符串的格式。
* @return
*/
public static Date parse(String dateStr, String format) throws ParseException {
if (dateStr == null) {
return null;
}
return new SimpleDateFormat(format).parse(dateStr);
}
/**
* 获取传入日期在当前年份中所属周数
*
* @param date
* @return
*/
public static Integer getWeek4Year(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.WEEK_OF_YEAR);
}
/**
* 设置周期(以年为单位的周期)
*
* @param date 指定日期
* @param weekOfYear
*/
public static Date setWeek(Date date, Integer weekOfYear) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
if (weekOfYear != null) {
calendar.set(Calendar.WEEK_OF_YEAR, weekOfYear);
return calendar.getTime();
}
return date;
}
/**
* 获取传入日期在当前年份中所属季度
*
* @param date
* @return
*/
public static Integer getSeason(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
int month = c.get(Calendar.MONTH);
int season = 0;
switch (month) {
case Calendar.JANUARY:
case Calendar.FEBRUARY:
case Calendar.MARCH:
season = 1;
break;
case Calendar.APRIL:
case Calendar.MAY:
case Calendar.JUNE:
season = 2;
break;
case Calendar.JULY:
case Calendar.AUGUST:
case Calendar.SEPTEMBER:
season = 3;
break;
case Calendar.OCTOBER:
case Calendar.NOVEMBER:
case Calendar.DECEMBER:
season = 4;
break;
default:
break;
}
return season;
}
/**
* 获取当前日期是本月第几天
*
* @param date
* @return
*/
public static Integer getDay(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.DAY_OF_MONTH);
}
/**
* 获取当前日期的月份
*
* @param date
* @return
*/
public static Integer getMonth(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.MONTH) + 1;
}
/**
* 获取当前日期的年份
*
* @param date
* @return
*/
public static Integer getYear(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.YEAR);
}