Java日期常用操作



/**
 * 时间工具类
 * 
 * @author : 
 * @createTime : 2015年3月16日 上午10:45:48
 * @version : 1.0
 * @description :
 *
 */
public class DateUtils extends org.apache.commons.lang.time.DateUtils {

	/**
	 * 将日值字符串转换成Date类型
	 * 
	 * @param str
	 *            参数字符串
	 * @param format
	 *            格式
	 * @return Date
	 */
	public static Date parseDateString(String str, String format) {
		if (str == null || str.equals("")) {
			return null;
		}
		Date dt = null;
		try {
			DateFormat df = new SimpleDateFormat(format);
			dt = df.parse(str);

		} catch (Exception pe) {
		}

		return dt;
	}

	/**
	 * 调整时间 将指定日期调整 时间
	 * 
	 * @param date
	 *            参数日期
	 * @param field
	 *            自定字段域
	 * @param amount
	 *            调整数量
	 * @param format
	 *            字符串格式
	 * @return String
	 */
	public static Date getAdjustDate(Date date, int field, int amount) {
		if (date == null) {
			return null;
		}
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		can.add(field, amount);
		Date newDate = can.getTime();
		return newDate;
	}

	/**
	 * 取2个时间相差的天数
	 * 
	 * @param date1
	 * @param date2
	 * @param isAbs
	 *            true:取绝对值 false:差值可能是负数
	 * @return
	 * @throws Exception
	 */
	public static long getBetweenDiffDay(Date date1, Date date2, boolean isAbs) throws Exception {
		long date1Value = date1.getTime();
		long date2Value = date2.getTime();
		long diff = (date1Value - date2Value) / (24 * 3600 * 1000);
		if (isAbs) {
			return Math.abs(diff);
		} else {
			return diff;
		}

	}

	/**
	 * 取2个时间相差的小时数
	 * 
	 * @param date1
	 * @param date2
	 * @param isAbs
	 *            true:取绝对值 false:差值可能是负数
	 * @return
	 * @throws Exception
	 */
	public static long getBetweenDiffHour(Date date1, Date date2, boolean isAbs) throws Exception {
		long date1Value = date1.getTime();
		long date2Value = date2.getTime();
		long diff = (date1Value - date2Value) / (3600 * 1000);
		if (isAbs) {
			return Math.abs(diff);
		} else {
			return diff;
		}
	}
	
	/**
	 * 取2个时间相差的分钟数
	 * 
	 * @param date1
	 * @param date2
	 * @param isAbs
	 *            true:取绝对值 false:差值可能是负数
	 * @return
	 * @throws Exception
	 */
	public static long getBetweenDiffMinute(Date date1, Date date2, boolean isAbs) throws Exception {
		long date1Value = date1.getTime();
		long date2Value = date2.getTime();
		long diff = (date1Value - date2Value) / (60 * 1000);
		if (isAbs) {
			return Math.abs(diff);
		} else {
			return diff;
		}
	}
	
	/**
	 * 获取两个时间相差剩余的天数小时分钟秒
	 * @param date1
	 * @param date2
	 * @return
	 *
	 * @author : weihui
	 * @createTime : 2015年5月8日 下午4:44:17
	 */
	public static Map<String,Integer> getBetweenDiffRemanentInfo(Date date1, Date date2){
		long time = date1.getTime() - date2.getTime();
		int day = (int) (time / (24 * 60 * 60 * 1000l));
		int hour = (int) ((time - day * 24 * 60 * 60 * 1000l)/ (60 * 60 * 1000l));
		int minute = (int) ((time - day * 24 * 60 * 60 * 1000l - hour * 60 * 60 * 1000l) / (60 * 1000l));
		int second = (int) ((time - day * 24 * 60 * 60 * 1000l - hour * 60 * 60 * 1000l - minute * 60 * 1000l) / 1000l);
		Map<String,Integer> map = new HashMap<String, Integer>();
		map.put("day", day);
		map.put("hour", hour);
		map.put("minute", minute);
		map.put("second", second);
		return map;
	}
	
	public static void main(String[] args) throws Exception {
		Date date1 = new Date();
		Date date2 = DateFormatUtils.format("2015-05-08 16:35", "yyyy-MM-dd HH:mm");
		System.out.println(getBetweenDiffDay(date1, date2, true));
		System.out.println(getBetweenDiffHour(date1, date2, true));
		System.out.println(getBetweenDiffMinute(date1, date2, true));
	}

	/**
	 * 得到指定日期所在月的最后一天,如果给定时间是月末,返回值应该是下个月末
	 * 
	 * @param date
	 * @return Date
	 */
	public static Date getMonthEnd(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明给定时间是月末,返回值应该是下个月末
		if (can.get(Calendar.DAY_OF_MONTH) == can.getActualMaximum(Calendar.DAY_OF_MONTH)) {
			can.add(Calendar.MONTH, 1);
		}
		can.set(Calendar.DAY_OF_MONTH, can.getActualMaximum(Calendar.DAY_OF_MONTH));
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);

		return can.getTime();
	}

	/**
	 * 得到指定日期所在月的第一天的0点0分0秒
	 * 
	 * @param date
	 * @return Date
	 */
	public static Date getCurrentMonthBegin(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明给定时间是月末,返回值应该是下个月末

		can.set(Calendar.DAY_OF_MONTH, can.getActualMinimum(Calendar.DAY_OF_MONTH));
		can.set(Calendar.HOUR_OF_DAY, 00);
		can.set(Calendar.MINUTE, 00);
		can.set(Calendar.SECOND, 00);

		return can.getTime();
	}

	/**
	 * 得到指定日期所在月的第最后天的23点59分59秒
	 * 
	 * @param date
	 * @return Date
	 */
	public static Date getCurrentMonthEnd(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明给定时间是月末,返回值应该是下个月末

		can.set(Calendar.DAY_OF_MONTH, can.getActualMaximum(Calendar.DAY_OF_MONTH));
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);

		return can.getTime();
	}

	/**
	 * 得到今天所在月的最后一天, 如果给定时间是月末,返回值应该是下个月末
	 * 
	 * @return Date
	 */
	public static Date getMonthEnd() {
		Date date = new Date();
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明给定时间是月末,返回值应该是下个月末
		if (can.get(Calendar.DAY_OF_MONTH) == can.getActualMaximum(Calendar.DAY_OF_MONTH)) {
			can.add(Calendar.MONTH, 1);
		}
		can.set(Calendar.DAY_OF_MONTH, can.getActualMaximum(Calendar.DAY_OF_MONTH));
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);

		return can.getTime();
	}

	/**
	 * 得到指定日期所在周的的最后一天,如果传入的时间已经是周末,返回值应该是下个周末
	 * 
	 * @param date
	 * @return Date
	 */
	public static Date getWeekEnd(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明传入的时间已经是周末,返回值应该是下个周末
		if (1 == can.get(Calendar.DAY_OF_WEEK)) {
			can.add(Calendar.WEEK_OF_MONTH, 1);
		}
		can.set(Calendar.DAY_OF_WEEK, can.getActualMaximum(Calendar.DAY_OF_WEEK));
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);
		can.add(Calendar.DAY_OF_MONTH, 1);
		return can.getTime();
	}

	/**
	 * 得到指定日期第二天的结束时间
	 * 
	 * @param date
	 * @return Date
	 */
	public static Date getTomorrowEnd(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);
		can.add(Calendar.DAY_OF_MONTH, 1);
		return can.getTime();
	}

	/**
	 * 获得指定天的昨天的最后时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getYesterdayEnd(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);
		can.add(Calendar.DAY_OF_MONTH, -1);
		return can.getTime();
	}

	public static Date getYesterdayStart(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		can.set(Calendar.HOUR_OF_DAY, 00);
		can.set(Calendar.MINUTE, 00);
		can.set(Calendar.SECOND, 00);
		can.add(Calendar.DAY_OF_MONTH, -1);
		return can.getTime();
	}

	/**
	 * 设置特定时间的小时偏移量和天数偏移量。
	 * 
	 * @param date
	 *            指定的天
	 * @param hourOffset
	 *            小时偏移量 正数为增加小时,负数为减去小时
	 * @param dateOffset
	 *            天数偏移量 正数为增加天 ,负数为减去天
	 * @param startOrEnd
	 *            0为开始时间忽略小时偏移量,例:2008-01-10 00:00:00 1为结束时间忽略小时偏移量,例:2008-01-10
	 *            23:59:59 2为指定时间的偏移量时间 例:偏移量为-1 指定时间为2008-01-10 00:00:00
	 *            返回时间为:2008-01-09 23:00:00
	 * @return
	 */
	public static Date getAppointDateByOffset(Date date, int hourOffset, int dateOffset, int startOrEnd) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		int hourOfDay = hourOffset;
		int minute = 0;
		int second = 0;
		if (startOrEnd == 1) {
			hourOfDay = 23;
			minute = 59;
			second = 59;
		} else if (startOrEnd == 2) {
			hourOfDay = hourOffset;
			minute = 0;
			second = 0;
		}

		can.set(Calendar.HOUR_OF_DAY, hourOfDay);
		can.set(Calendar.MINUTE, minute);
		can.set(Calendar.SECOND, second);
		can.add(Calendar.DAY_OF_MONTH, dateOffset);
		return can.getTime();
	}

	/**
	 * 得到现在时间所在周的的最后一天,如果传入的时间已经是周末,返回值应该是下个周末
	 * 
	 * @return Date
	 */
	public static Date getWeekEnd() {
		Date date = new Date();
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明传入的时间已经是周末,返回值应该是下个周末
		if (1 == can.get(Calendar.DAY_OF_WEEK)) {
			can.add(Calendar.WEEK_OF_MONTH, 1);
		}
		can.set(Calendar.DAY_OF_WEEK, can.getActualMaximum(Calendar.DAY_OF_WEEK));
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);
		can.add(Calendar.DAY_OF_MONTH, 1);
		return can.getTime();
	}

	/**
	 * 取得偏移时间
	 * 
	 * @param nowDate
	 *            date偏移时间;
	 * @param day
	 *            偏移天数
	 * @param status
	 *            为分钟量 0是返回时间为00:00:00 ;1是返回为23:59:59; 2返回原始
	 * @return
	 */
	public static Date getOffsetTime(Date nowDate, int day, int status) {
		Calendar curCalendar = Calendar.getInstance();
		curCalendar.setTime(nowDate);
		long t = curCalendar.getTimeInMillis() + day * 24 * 60 * 60 * 1000L;
		curCalendar.setTimeInMillis(t);
		if (status == 0) {
			curCalendar.set(Calendar.HOUR_OF_DAY, 0);
			curCalendar.set(Calendar.MINUTE, 0);
			curCalendar.set(Calendar.SECOND, 0);
		} else if (status == 1) {
			curCalendar.set(Calendar.HOUR_OF_DAY, 23);
			curCalendar.set(Calendar.MINUTE, 59);
			curCalendar.set(Calendar.SECOND, 59);
		}
		return curCalendar.getTime();
	}

	/**
	 * 返回指定天的开始
	 * 
	 * @param date
	 * @return
	 */
	public static Date getCurrentDayBegin(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		can.set(Calendar.HOUR_OF_DAY, 00);
		can.set(Calendar.MINUTE, 00);
		can.set(Calendar.SECOND, 00);
		return can.getTime();
	}

	/**
	 * 返回指定天的结束
	 * 
	 * @param date
	 * @return
	 */
	public static Date getCurrentDayEnd(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);
		return can.getTime();
	}

	/**
	 * 获取指定日期,指定偏移月份的日期
	 * 
	 * @param date
	 * @param month
	 * @return
	 */
	public static Date getOffsetTimeByMonth(Date date, int month) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int sMonth = calendar.get(Calendar.MONTH);
		calendar.set(Calendar.MONTH, sMonth - month);
		return calendar.getTime();
	}

	/**
	 * 获取时间差,返回固定格式yyyy_M_d
	 * 
	 * @param startTm
	 * @param endTm
	 * @return
	 */
	public static List<String> getDateFix(long startTm, long endTm) {
		List<String> ret = new ArrayList<String>();

		if (startTm > endTm)
			return ret;

		Calendar startCal = new GregorianCalendar(TimeZone.getTimeZone("GMT+8"));
		startCal.setTimeInMillis(startTm);
		// startCal.set(Calendar.DAY_OF_YEAR, 1);

		Calendar endCal = new GregorianCalendar(TimeZone.getTimeZone("GMT+8"));
		endCal.setTimeInMillis(endTm);
		// endCal.set(Calendar.DAY_OF_YEAR, 2);

		for (; startCal.before(endCal); startCal.add(Calendar.DAY_OF_YEAR, 1)) {
			String s = startCal.get(Calendar.YEAR) + "_" + (startCal.get(Calendar.MONTH) + 1) + "_"
					+ (startCal.get(Calendar.DATE));
			ret.add(s);
		}

		return ret;
	}

	/**
	 * 将一个java.util.Date类型变量依指定格式转换为字符串
	 * 
	 * @param d
	 * @param format
	 * @return
	 */
	public static String dateToString(Date d, String format) {
		if (d == null)
			return null;
		else
			return new SimpleDateFormat(format).format(d);
	}
	
	//将时间戳转换为int类型的日期格式 20160601
	public static int timeTo_yyyyMMdd(long time){
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
		return Integer.parseInt(dateFormat.format(time));
	}
	
	
	//将时间转换成String类型
	public static String dateToStringAccurateToDay(Date date){
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		return dateFormat.format(date);
	}
	//将时间戳转换成String类型
	public static String timeToStringAccurateToSecond(long time){
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = new Date(time);
		return dateFormat.format(date);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值