关于java时间的各种特殊要求

在开发中经常遇到各种个样的时间需求这边做一个整理。

首先把各种基础数据和时间格式初始化一下。

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;
	}

其他要求获取的时间可以用上面基本的函数进行转换后获取

你可能感兴趣的:(关于java时间的各种特殊要求)