下面是一个使用Date,Calendar类实现的日期的工具类,可能有些地方还需要作调整,现在是凭感觉写的,之后还会写一个使用Java8新日期API的工具类,二者功能相同。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 日期工具类
**/
public class DateUtil {
public static final String DATE_PATTERN = "yyyy-MM-dd";
public static final String TIME_PATTERM = "yyyy-MM-dd HH:mm:ss";
/**
* 按传入的格式 返回格式化的当前日期
*
* @param pattern
* @return
*/
public static String currentDayStr(String pattern) {
return currentDayStr(new Date(), pattern);
}
/**
* 按传入的格式 返回格式化的传入日期
*
* @param pattern
* @return
*/
public static String currentDayStr(Date date, String pattern) {
SimpleDateFormat formatter = new SimpleDateFormat(pattern);
return formatter.format(date);
}
/**
* 判断当前日期和传入日期是否是同一个月
*
* @param data
* @return
*/
public static boolean isCurrentMonth(Date data) {
Calendar now = Calendar.getInstance();
now.setTime(new Date());
Calendar otherDate = Calendar.getInstance();
otherDate.setTime(data);
return now.get(Calendar.MONTH) == otherDate.get(Calendar.MONTH)
&& now.get(Calendar.YEAR) == otherDate.get(Calendar.YEAR);
}
/**
* 判断传入日期和当前日期是否是同一天
*
* @param data
* @return
*/
public static boolean isCurrentDay(Date data) {
Calendar now = Calendar.getInstance();
now.setTime(new Date());
Calendar otherDate = Calendar.getInstance();
otherDate.setTime(data);
return now.get(Calendar.DAY_OF_YEAR) == otherDate.get(Calendar.DAY_OF_YEAR)
&& now.get(Calendar.MONTH) == otherDate.get(Calendar.MONTH)
&& now.get(Calendar.YEAR) == otherDate.get(Calendar.YEAR);
}
/**
* 返回传入日期的下一天日期,时分秒和当前日期相同
*
* @param currentDate 当前日期
* @return
*/
public static Date nextDay(Date currentDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(currentDate);
calendar.add(Calendar.DAY_OF_YEAR, 1);
return calendar.getTime();
}
/**
* 返回传入日期的上一天日期,时分秒和当前日期相同
*
* @param currentDate 当前日期
* @return
*/
public static Date previousDay(Date currentDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(currentDate);
calendar.add(Calendar.DAY_OF_YEAR, -1);
return calendar.getTime();
}
/**
* 返回传入日期当月的第一天日期,时分秒和当前日期相同
*
* @param currentDate
* @return
*/
public static Date firstDayOfMonth(Date currentDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(currentDate);
calendar.set(Calendar.DAY_OF_MONTH, 1);
return calendar.getTime();
}
/**
* 返回传入日期当月的最后一天日期,时分秒和当前日期相同
*
* @param currentDate
* @return
*/
public static Date lastDayOfMonth(Date currentDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(currentDate);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.DAY_OF_YEAR, -1);
return calendar.getTime();
}
/**
* 返回传入日期的当天开始 时分秒都是0
*
* @param now
* @return
*/
public static Date startOfDay(Date now) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return calendar.getTime();
}
/**
* 返回传入日期的当天结束 也是第二天的开始时间
*
* @param now
* @return
*/
public static Date endOfDay(Date now) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.add(Calendar.DAY_OF_YEAR, 1);
return calendar.getTime();
}
/**
* 判断当前日期和传入日期是否是同一个月
*
* @param dateStr 日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
* @param hasTimePart 如果传入格式是 yyyy-MM-dd,则传入false,格式是yyyy-MM-dd HH:mm:ss 传入true
* @return
*/
public static boolean isCurrentMonth(String dateStr, boolean hasTimePart) throws ParseException {
return isCurrentMonth(parseDate(dateStr, hasTimePart));
}
/**
* 判断传入日期和当前日期是否是同一天
*
* @param dateStr 日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
* @param hasTimePart 如果传入格式是 yyyy-MM-dd,则传入false,格式是yyyy-MM-dd HH:mm:ss 传入true
* @return
*/
public static boolean isCurrentDay(String dateStr, boolean hasTimePart) throws ParseException {
return isCurrentDay(parseDate(dateStr, hasTimePart));
}
/**
* 返回传入日期的下一天日期,时分秒和当前日期相同
*
* @param dateStr 日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
* @param hasTimePart 如果传入格式是 yyyy-MM-dd,则传入false,格式是yyyy-MM-dd HH:mm:ss 传入true
* @return
*/
public static Date nextDay(String dateStr, boolean hasTimePart) throws ParseException {
return nextDay(parseDate(dateStr, hasTimePart));
}
/**
* 返回传入日期的上一天日期,时分秒和当前日期相同
*
* @param dateStr 日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
* @param hasTimePart 如果传入格式是 yyyy-MM-dd,则传入false,格式是yyyy-MM-dd HH:mm:ss 传入true
* @return
*/
public static Date previousDay(String dateStr, boolean hasTimePart) throws ParseException {
return previousDay(parseDate(dateStr, hasTimePart));
}
/**
* 返回传入日期当月的第一天日期,时分秒和当前日期相同
*
* @param dateStr 日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
* @param hasTimePart 如果传入格式是 yyyy-MM-dd,则传入false,格式是yyyy-MM-dd HH:mm:ss 传入true
* @return
*/
public static Date firstDayOfMonth(String dateStr, boolean hasTimePart) throws ParseException {
return firstDayOfMonth(parseDate(dateStr, hasTimePart));
}
/**
* 返回传入日期当月的最后一天日期,时分秒和当前日期相同
*
* @param dateStr 日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
* @param hasTimePart 如果传入格式是 yyyy-MM-dd,则传入false,格式是yyyy-MM-dd HH:mm:ss 传入true
* @return
*/
public static Date lastDayOfMonth(String dateStr, boolean hasTimePart) throws ParseException {
return lastDayOfMonth(parseDate(dateStr, hasTimePart));
}
/**
* 返回传入日期的当天开始 时分秒都是0
*
* @param dateStr 日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
* @param hasTimePart 如果传入格式是 yyyy-MM-dd,则传入false,格式是yyyy-MM-dd HH:mm:ss 传入true
* @return
*/
public static Date startOfDay(String dateStr, boolean hasTimePart) throws ParseException {
return startOfDay(parseDate(dateStr, hasTimePart));
}
/**
* 返回传入日期的当天结束 也是第二天的开始时间
*
* @param dateStr 日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
* @param hasTimePart 如果传入格式是 yyyy-MM-dd,则传入false,格式是yyyy-MM-dd HH:mm:ss 传入true
* @return
*/
public static Date endOfDay(String dateStr, boolean hasTimePart) throws ParseException {
return endOfDay(parseDate(dateStr, hasTimePart));
}
/**
* 判断当前日期和传入日期是否是同一个月
* @param timeStamp 毫秒时间戳
* @return
*/
public static boolean isCurrentMonth(long timeStamp) {
return isCurrentMonth(new Date(timeStamp));
}
/**
* 判断传入日期和当前日期是否是同一天
* @param timeStamp 毫秒时间戳
* @return
*/
public static boolean isCurrentDay(long timeStamp) {
return isCurrentDay(new Date(timeStamp));
}
/**
* 返回传入日期的下一天日期,时分秒和当前日期相同
*
* @param timeStamp 毫秒的时间戳
* @return
*/
public static Date nextDay(long timeStamp) {
return nextDay(new Date(timeStamp));
}
/**
* 返回传入日期的上一天日期,时分秒和当前日期相同
*
* @param timeStamp 毫秒的时间戳
* @return
*/
public static Date previousDay(long timeStamp) {
return previousDay(new Date(timeStamp));
}
/**
* 返回传入日期当月的第一天日期,时分秒和当前日期相同
*
* @param timeStamp 毫秒的时间戳
* @return
*/
public static Date firstDayOfMonth(long timeStamp) {
return firstDayOfMonth(new Date(timeStamp));
}
/**
* 返回传入日期当月的最后一天日期,时分秒和当前日期相同
*
* @param timeStamp 毫秒的时间戳
* @return
*/
public static Date lastDayOfMonth(long timeStamp) {
return lastDayOfMonth(new Date(timeStamp));
}
/**
* 返回传入日期的当天开始 时分秒都是0
*
* @param nowTimeStamp 毫秒的时间戳
* @return
*/
public static Date startOfDay(long nowTimeStamp) {
return startOfDay(new Date(nowTimeStamp));
}
/**
* 返回传入日期的当天结束 也是第二天的开始时间
*
* @param nowTimeStamp 毫秒的时间戳
* @return
*/
public static Date endOfDay(long nowTimeStamp) {
return endOfDay(new Date(nowTimeStamp));
}
private static SimpleDateFormat getDateFormat(boolean hasTimePart) {
if (hasTimePart) {
return new SimpleDateFormat(TIME_PATTERM);
} else {
return new SimpleDateFormat(DATE_PATTERN);
}
}
private static Date parseDate(String dateStr, boolean hasTimePart) throws ParseException {
SimpleDateFormat dateFormat = getDateFormat(hasTimePart);
return dateFormat.parse(dateStr);
}
public static void main(String[] args) throws ParseException {
System.out.println(DateUtil.nextDay(new Date()));
System.out.println(DateUtil.firstDayOfMonth(new Date()));
System.out.println(DateUtil.lastDayOfMonth(new Date()));
System.out.println(DateUtil.startOfDay(new Date()));
System.out.println(DateUtil.endOfDay(new Date()));
System.out.println((DateUtil.endOfDay("2018-12-12 12:12:12", true)));
System.out.println((DateUtil.endOfDay(System.currentTimeMillis())));
}
}