在开发中经常遇到各种个样的时间需求这边做一个整理。
首先把各种基础数据和时间格式初始化一下。
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class DateUtil {
public static final String PATTERN_DATE_TIME_MILLIS = "yyyy-MM-dd HH:mm:ss.SSS";
public static final String PATTERN_DATE_TIME_MIN="yyyy-MM-dd HH:mm";
public static final String PATTERN_DATE_TIME_HOUR="yyyy-MM-dd HH";
public static final String PATTERN_DATE_TIME = "yyyy-MM-dd HH:mm:ss";
public static final String PATTERN_DATE = "yyyy-MM-dd";
public static final String PATTERN_DATE_YEAR_MONTH = "yyyy-MM";
public static final String PATTERN_TIME = "HH:mm:ss";
public static final String PATTERN_DATE_TIME_MILLIS = "yyyy-MM-dd HH:mm:ss.SSS";
public static final String PATTERN_DATE_TIME_MIN="yyyy-MM-dd HH:mm";
public static final String PATTERN_DATE_TIME_HOUR="yyyy-MM-dd HH";
public static final String PATTERN_DATE_TIME = "yyyy-MM-dd HH:mm:ss";
public static final String PATTERN_DATE = "yyyy-MM-dd";
public static final String PATTERN_DATE_YEAR_MONTH = "yyyy-MM";
public static final String PATTERN_TIME = "HH:mm:ss";
public static final SimpleDateFormat dateTimeMillisFormat = new SimpleDateFormat(PATTERN_DATE_TIME_MILLIS);//格式化为年月日 时分毫秒
public static final SimpleDateFormat dateTimeFormat = new SimpleDateFormat(PATTERN_DATE_TIME);//格式化为年月日 时分秒
public static final SimpleDateFormat dateFormat = new SimpleDateFormat(PATTERN_DATE);//格式化为年月日
public static final SimpleDateFormat timeFormat = new SimpleDateFormat(PATTERN_TIME);//格式化为时分秒
public static final SimpleDateFormat dateTimeMinuteFormat = new SimpleDateFormat(PATTERN_DATE_TIME_MIN); //格式化为年月日 时分
public static final SimpleDateFormat dateTimeHourFormat = new SimpleDateFormat(PATTERN_DATE_TIME_HOUR);//格式化为年月日 时
public static final SimpleDateFormat dateYearMonthFormat = new SimpleDateFormat(PATTERN_DATE_YEAR_MONTH);//格式化为年月
/**
* 获取当前时间
*
* @return
*/
public static Date now() {
return new Date();
}
}
下面则以各种函数的形式出现处理时间的方法:
1.将日期格式装换为想对应的字符串。
这是第一重写法传入相对应的String日期格式将日期转为字符串
public static String format(Date date, String pattern) {
if (date == null) {
return null;
}
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
return (dateFormat.format(date));
}
这是通过最上面的已经设置好的静态变量SimpleDateFormat 进行转换。
可根据传入的具体时间,使用相对应的静态变量,进行日期和字符串之间的转换
public static String formatDateTime(Date date) {
if (date == null) {
return null;
}
return DateUtil.dateTimeFormat.format(date);//此处的dateTimeFormat可换成上面的任意一个静态变量
}
获取当前时间转换为字符串
public static String getDate() {
return DateUtil.dateFormat.format(now());
}
2.将指定的字符串转换为日期对象。
将指定的字符串按照格式转为日期对象
public static Date parse(String date, String pattern) throws ParseException {
if (StringUtils.isBlank(date)) {
return null;
}
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
return dateFormat.parse(date);
}
同上根据静态变量(日期格式),将日期字符串转换为日期对象
public static Date parseDateTime(String date) throws ParseException {
if (StringUtils.isBlank(date)) {
return null;
}
return DateUtil.dateTimeFormat.parse(date);//根据需要使用静态日期格式
}
3.为时间加上或减去指定毫秒,秒,分,时,天、月或年等(根据具体添加减少的时间,计算出所需要的时间)
/**
* 为时间加上或减去指定毫秒,秒,分,时,天、月或年等
*
* @param date
* @param field Calendar.DATE,Calendar.MONTH,Calendar.YEAR,
* Calendar.MILLISECOND,Calendar.SECOND,Calendar.MINUTE,Calendar.HOUR
* @param amount 正、负数
* @return
*/
public static Date add(Date date, int field, int amount) {
if (date == null) {
return date;
}
Calendar cal = getCalendar(date);
cal.add(field, amount);
return cal.getTime();
}
public static Date addMilliSecond(Date date, int amount) {
return add(date, Calendar.MILLISECOND, amount);
}
public static Date addSecond(Date date, int amount) {
return add(date, Calendar.SECOND, amount);
}
public static Date addMiunte(Date date, int amount) {
return add(date, Calendar.MINUTE, amount);
}
public static Date addHour(Date date, int amount) {
return add(date, Calendar.HOUR, amount);
}
public static Date addDay(Date date, int amount) {
return add(date, Calendar.DATE, amount);
}
public static Date addMonth(Date date, int amount) {
return add(date, Calendar.MONTH, amount);
}
public static Date addYear(Date date, int amount) {
return add(date, Calendar.YEAR, amount);
}
4.获取具体时间的所需要相对应的数值(int类型)
/**
* 获取传入的时间的年份
* @param date
* @return int
*/
public static int getCurrentYear(Date date) {
Calendar cal = getCalendar(date);
return cal.get(Calendar.YEAR);
}
/**
* 获取传入的时间的月份
* @param date
* @return int
*/
public static int getCurrentMonth(Date date) {
Calendar cal = getCalendar(date);
return cal.get(Calendar.MONTH);
}
/**
* 获取传入的时间的当前月份的天数
* @param date
* @return int
*/
public static int getDayOfMonth(Date date) {
Calendar cal = getCalendar(date);
return cal.get(Calendar.DAY_OF_MONTH);
}
/**
* 获取传入的时间的在当前周的第几天(星期天是这周的第一天)
* @param date
* @return int
*/
public static int getDayOfWeek(Date date) {
Calendar cal = getCalendar(date);
return cal.get(Calendar.DAY_OF_WEEK);
}
/**
* 获取传入的时间的当前小时
* @param date
* @return int
*/
public static int getHourOfDay(Date date) {
Calendar cal = getCalendar(date);
return cal.get(Calendar.HOUR_OF_DAY);
}
/**
* 获取传入的当前小时的分钟
* @param date
* @return int
*/
public static int getMinuteOfHour(Date date) {
Calendar cal = getCalendar(date);
return cal.get(Calendar.MINUTE);
}
5.以下是获取一些比较特殊要求的时间
获取本月的一天和本月的最后一天的具体日期
/**
* 获取传入的时间的当前月的1号的具体日期
* @param date
* @return int
*/
public static Date getFirstDateOfMonth(Date date) {
Calendar cal = getCalendar(date);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));// Calendar.DATE
return DateUtils.truncate(cal.getTime(), Calendar.DAY_OF_MONTH);
}
/**
* 获取传入的时间的当前月的最后一天的具体日期
* @param date
* @return int
*/
public static Date getLastDateOfMonth(Date date) {
Calendar cal = getCalendar(date);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));// Calendar.DATE
return DateUtils.truncate(cal.getTime(), Calendar.DAY_OF_MONTH);
}
获取当前日期的上一个月的日期(自然月30天)
/**
* 获取当前日期的上一个月的日期(自然月30天)
*
* @return
*/
public static String getLastMonthDay() {
Calendar now = Calendar.getInstance();
now.add(Calendar.DAY_OF_MONTH, -30);
String endDate = new SimpleDateFormat("yyyy-MM-dd").format(now.getTime());
return endDate;
}
获取当前日期的上一个月日期(根据Java中的规则自行判断是31,30,29,28天)
/**
* 获取当前日期的上一个月的日期(按照月份)
*
*/
public static String getLastMonth(){
Calendar calendar = Calendar.getInstance();
calendar.setTime(now()); // 设置为当前时间
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1); // 设置为上一个月
return dateFormat.format(calendar.getTime());
}
获取两个日期之间的 各种所需的时间。以list的形式存储获取的时间。往函数里传开始时间和结束时间,取出两个时刻之间的每一个时刻(时,天,月)如 2015年-2018年 为 2015,2016,2017,2018
/**
* 两个时刻之间,具体的小时
*
*/
public static List getHourBetween(Date dBegin, Date dEnd) {
List lDate = new ArrayList<>();
lDate.add(DateUtil.format(dBegin,PATTERN_DATE_TIME_HOUR)+":00");
Calendar calBegin = Calendar.getInstance();
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
calEnd.setTime(dEnd);
while (dEnd.after(calBegin.getTime())) {
calBegin.add(Calendar.HOUR, 1);
lDate.add(dateTimeHourFormat.format(calBegin.getTime())+":00");
}
return lDate;
}
/**
* 两个日期之间,具体的每天的时间
*
*/
public static List getDaysBetween(Date dBegin, Date dEnd) {
List lDate = new ArrayList<>();
lDate.add(DateUtil.format(dBegin,DateUtil.PATTERN_DATE));
Calendar calBegin = Calendar.getInstance();
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
calEnd.setTime(dEnd);
while (dEnd.after(calBegin.getTime())) {
calBegin.add(Calendar.DAY_OF_YEAR, 1);
lDate.add(dateFormat.format(calBegin.getTime()));
}
return lDate;
}
/**
* 查询两个日期之间的月份
*
*/
public static List getMonthBetween(Date dBegin, Date dEnd) throws ParseException {
ArrayList result = new ArrayList();
Calendar calBegin = Calendar.getInstance();
Calendar calEnd = Calendar.getInstance();
calBegin.setTime(dBegin);
calBegin.set(calBegin.get(Calendar.YEAR), calBegin.get(Calendar.MONTH), 1);
calEnd.setTime(dEnd);
calEnd.set(calEnd.get(Calendar.YEAR), calEnd.get(Calendar.MONTH), 2);
Calendar curr = calBegin;
while (curr.before(calEnd)) {
result.add(dateYearMonthFormat.format(curr.getTime()));
curr.add(Calendar.MONTH, 1);
}
return result;
}
其他要求获取的时间可以用上面基本的函数进行转换后获取