`

DateUtil 工具类

 
阅读更多
package com.sf.wop.common.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DateUtil {

	public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss SSS";
	public static final String ORA_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
	public static final String DATE_TIME_FORMAT_YMD = "yyyyMMdd";
	
	public static final String DATE_TIME_FORMAT_MMDDHHmm = "MMddHHmm";
	
	private static Logger logger = LoggerFactory.getLogger(DateUtil.class);
	
	private static final String DATE_FORMAT = "yyyy-MM-dd";
	
   /** 
    * 判断当前日期是星期几 1-7
    *  
    * @param pTime 修要判断的时间 
    * @return dayForWeek 判断结果 
    * @Exception 发生异常 
    */  
	public static int dayOfWeek(String pTime) throws Exception {
		SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT);
		Calendar c = Calendar.getInstance();
		c.setTime(format.parse(pTime));
		int dayForWeek = 0;
		if (c.get(Calendar.DAY_OF_WEEK) == 1) {
			dayForWeek = 7;
		} else {
			dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
		}
		return dayForWeek;
	}
	
	/**
	 * @param dateBgn 开始日期
	 * @param dateEnd 结束日期
	 * @return  日期间隔天数
	 * @throws ParseException
	 */
	public static int getIntervalDays(String dateBgn, String dateEnd) throws ParseException{
		SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT);
		
		Calendar aCalendar = Calendar.getInstance();
		aCalendar.setTime(format.parse(dateEnd));
		int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);
		aCalendar.setTime(format.parse(dateBgn));
		int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);
		
		return day2 - day1;
	}
	
	/**
	 * @param dateBgn 开始日期
	 * @param dateEnd 结束日期
	 * @return  日期间隔分钟
	 * @throws ParseException
	 */
	public static long getIntervalMin(String dateBgn, String dateEnd, String format) throws ParseException{
		SimpleDateFormat DateFormat = new SimpleDateFormat(format);
		
		Date end = DateFormat.parse(dateEnd);
		Date begin = DateFormat.parse(dateBgn);
		return (end.getTime() - begin.getTime())/1000/90;
	}
	
	/**
	 * 把日期往后增加n月. 整数往后推,负数往前移动 
	 * 
	 * @param dateStr
	 * @param interval
	 * @return
	 * @throws ParseException 
	 */
	public static String calcMonth(String dateStr, int interval) throws ParseException{
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
		Calendar   calendar   =   new   GregorianCalendar(); 
		calendar.setTime(format.parse(dateStr)); 
		calendar.add(Calendar.MONTH, interval);
		
		return format.format(calendar.getTime());
	}
	
	/**
	 * 把日期往后增加n天. 整数往后推,负数往前移动 
	 * 
	 * @param dateStr
	 * @param interval
	 * @return
	 * @throws ParseException 
	 */
	public static String calcDate(String dateStr, int interval) throws ParseException{
		SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT);
		Calendar   calendar   =   new   GregorianCalendar(); 
		calendar.setTime(format.parse(dateStr)); 
		calendar.add(Calendar.DATE, interval);
		
		return format.format(calendar.getTime());
	}
	
	/**
	 * 把日期往后增加n天. 整数往后推,负数往前移动 
	 * 
	 * @param dateStr
	 * @param interval
	 * @return
	 * @throws ParseException 
	 */
	public static Date calcDate(String dataStr, String format, int interval, int intervalType) throws ParseException{
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		
		Calendar   calendar   =   new   GregorianCalendar(); 
		calendar.setTime(dateFormat.parse(dataStr)); 
		calendar.add(intervalType, interval);
		
		return calendar.getTime();
	}
	
	/**
	 * 把日期往后增加n天. 整数往后推,负数往前移动 
	 * 
	 * @param dateStr
	 * @param interval
	 * @return
	 * @throws ParseException 
	 */
	public static Date calcDate(Date date, int interval, int intervalType) {
		Calendar   calendar   =   new   GregorianCalendar(); 
		calendar.setTime(date); 
		calendar.add(intervalType, interval);
		
		return calendar.getTime();
	}
	
	/**
	 * 把日期往后增加n天. 整数往后推,负数往前移动 
	 * 
	 * @param dateStr
	 * @param interval
	 * @return
	 * @throws ParseException 
	 */
	public static Date calcDate(String dateStr, int interval, int intervalType) throws ParseException{
		SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT);
		Calendar   calendar   =   new   GregorianCalendar(); 
		calendar.setTime(format.parse(dateStr)); 
		calendar.add(intervalType, interval);
		
		return calendar.getTime();
	}
	
	public static int getBetweenDays(String t1, String t2)
			   throws ParseException {
			  DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
			  int betweenDays = 0;
			  Date d1 = format.parse(t1);
			  Date d2 = format.parse(t2);
			  Calendar c1 = Calendar.getInstance();
			  Calendar c2 = Calendar.getInstance();
			  c1.setTime(d1);
			  c2.setTime(d2);
			  // 保证第二个时间一定大于第一个时间
			  if (c1.after(c2)) {
			   c1 = c2;
			   c2.setTime(d1);
			  }
			  int betweenYears = c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR);
			  betweenDays = c2.get(Calendar.DAY_OF_YEAR) - c1.get(Calendar.DAY_OF_YEAR);
			  for (int i = 0; i < betweenYears; i++) {
			   c1.set(Calendar.YEAR, (c1.get(Calendar.YEAR) + 1));
			   betweenDays += c1.getMaximum(Calendar.DAY_OF_YEAR);
			  }
			  return betweenDays;
	}

	/**
	 * 把日期往后增加n天. 整数往后推,负数往前移动 
	 * 
	 * @param dateStr
	 * @param interval
	 * @return
	 * @throws ParseException 
	 */
	public static String calcDate(Date date, int interval) throws ParseException{
		SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT);
		Calendar calendar = new GregorianCalendar(); 
		calendar.setTime(date); 
		calendar.add(Calendar.DATE, interval);
		
		return format.format(calendar.getTime());
	}
	
	public static List<String> getDaysExcluded(String dateBgn, String dateEnd, String weekSelected){
		List<String> days = new ArrayList<>();
		
		String[] weekInfo = weekSelected.split(",");
		if(weekInfo == null || weekInfo.length == 0){
			logger.warn(String.format("at least one day in week should be selectd: %s", weekSelected));
			return days;
		}
		
		Map<String, String> dayOfWeekMap = new HashMap<String, String>();
		for(String index : weekInfo){
			dayOfWeekMap.put(index, index);
		}
		
		Map<String, String> usDayOfweekMap = new HashMap<String, String>();
		for(int i = 1; i <= 7; i++){
			if(dayOfWeekMap.containsKey(""+i)){
				continue;
			}
			
			usDayOfweekMap.put(""+i, ""+i);
		}
		
		//没有排除任何一天
		if(usDayOfweekMap.size() == 0){
			return days;
		}
		
		int interval = 0;
		try {
			interval = getIntervalDays(dateBgn, dateEnd);
		} catch (ParseException e) {
			logger.warn(String.format("invalid date format: %s or %s", dateBgn,dateEnd));
			return days;
		}
		if(interval < 0){
			logger.warn(String.format("end day shoule be equal or greater than begin day: %s or %s", dateBgn,dateEnd));
			return days;
		}
		
		int dayIndex = 0;
		try {
			dayIndex = dayOfWeek(dateBgn);
		} catch (Exception e) {
			logger.warn(String.format("invalid date format: %s", dateBgn));
			return days;
		}
				
		for(int i=0;i<= interval;i++){
			//当前为非选择的星期序号
			if(usDayOfweekMap.containsKey(""+dayIndex)){
				try {
					days.add(calcDate(dateBgn, i));
				} catch (ParseException e) {
				}
			}
			
			//下一个日期的星期序号
			dayIndex++;
			if(dayIndex>7){
				dayIndex -= 7;
			}
		}
		
		return days;
	}
	
	public static String format(Date date) {
		String result = DateFormatUtils.format(date, DATE_TIME_FORMAT);
		return result;
	}
	
	public static String format(Date date, String format) {
		String result = DateFormatUtils.format(date, format);
		return result;
	}
	
	public static Date parseDate(String dateStr) {
		DateFormat dateFormat = new SimpleDateFormat(ORA_DATE_TIME_FORMAT);
		try {
			return dateFormat.parse(dateStr);
		} catch (ParseException e) {
			logger.error("DateUtil parseDate error", e);
		}
		return null;
	}
	
	public static Date parseDate(String dateStr, String format) {
		DateFormat dateFormat = new SimpleDateFormat(format);
		try {
			return dateFormat.parse(dateStr);
		} catch (ParseException e) {
			logger.error("DateUtil parseDate error", e);
		}
		return null;
	}
	
	public static List<String> getTimesBetween(String beginDateStr, String endDateStr, String inputFormat, 
			String outFormat, int interval, int intervalType){
		
		List<String> rtn = new ArrayList<String>();
		Date beginDate = parseDate(beginDateStr, inputFormat);
		Date endDate = parseDate(endDateStr, inputFormat);
		
		if(beginDate.after(endDate)){
			return rtn;
		}
		
		//加入起始日期
		rtn.add(format(beginDate, outFormat));
		
		Date curDate = calcDate(beginDate, interval, intervalType);
		
		while(!curDate.after(endDate)){
			//加入起始日期
			rtn.add(format(curDate, outFormat));
			
			curDate = calcDate(curDate, interval, intervalType);
		}

		return rtn;
	}
	
	public static void main(String[] args) {
		
//		String s = "2016-05-33 15:25:25";
//		System.out.println(parseDate(s));
//		String cur = "2016-02-21";
//		String end = "2016-03-08";
//		
//		try {
//			System.out.println(dayOfWeek(cur));
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		
//		List<String> days = getDaysExcluded(cur, end, "1,3,5");
//		for(String day : days){
//			System.out.println(day);
//		}
//		
//		try {
//			System.out.println(getBetweenDays("2016-01-17","2016-01-19"));
//		} catch (ParseException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}

		long stt = System.currentTimeMillis();
		
		List<String> result = getTimesBetween("201606302050","201607010400","yyyyMMddHHmm","ddHH",1,Calendar.HOUR);
		for(String str : result){
			System.out.println(str);
		}
		
		//System.out.println((System.currentTimeMillis() - stt));
	}
}

 

分享到:
评论

相关推荐

    dateUtil工具类

    在Java编程中,DateUtil工具类是用于处理和操作日期时间的一个常见实用程序类。它提供了许多方便的方法,使得开发者可以轻松地进行日期格式化、转换以及比较等操作。在这个"dateUtil工具类"中,我们可以看到核心功能...

    史上最全面DateUtil工具类,没有之一

    在Java编程领域,DateUtil工具类是开发人员经常会用到的一种辅助类,它提供了一系列方便的方法来处理日期和时间。这个被称为"史上最全面DateUtil工具类,没有之一"的资源,显然包含了处理日期和时间的各种功能,使得...

    java DateUtil工具类时间戳类型转换详解

    Java DateUtil 工具类时间戳类型转换详解 Java DateUtil 工具类是 Java 开发中经常使用的一种日期处理工具类,它提供了多种日期处理方法,包括时间戳类型转换、日期格式化、日期解析等。下面我们将详细介绍 Java ...

    JS DateUtil工具类

    JS日期工具类,方便大家的使用。后期会持续更新.......

    Android-Java中的日期转化格式DateUtil工具类

    这里我们关注的是`DateUtil`工具类,它专门用于处理日期转换格式的操作。`DateUtil`工具类通常包含了对日期进行格式化、解析、比较等常用功能,使得在Android项目中处理日期变得更加便捷。 在Java中,日期对象主要...

    Android开发中日期工具类DateUtil完整实例

    今天,我们将详细介绍DateUtil工具类的实现和使用。 日期工具类的重要性 在Android开发中,日期和时间是非常常见的数据类型。因此,处理日期和时间相关的操作是非常重要的。DateUtil工具类提供了许多有用的方法来...

    DateUtil(通用日期工具类)

    在Java编程中,DateUtil是一个常见的...这些是DateUtil工具类中常见的功能,它们极大地简化了日期和时间的处理工作,提高了代码的可读性和可维护性。在实际项目中,可以根据需求自定义更多实用的方法,提高开发效率。

    DateUtil日期工具类

    DateUtil 日期工具类

    java操作 工具类1.0

    DateUtil工具类旨在简化这个过程。它可能包含一系列静态方法,如获取当前日期、格式化日期字符串、进行日期比较、计算两个日期之间的差值等。例如,可以有一个`formatDate(Date date, String pattern)`方法,用于将...

    dateUtil js工具类

    dateUtil js工具类

    原创强大的jdbc数据库操作工具类

    原创强大的jdbc数据库操作工具类: 1.获取数据源 2.设置数据源 3.获取数据库连接 4.执行insert/delete语句,一个参数列表 ...源码用到的DateUtil工具类,请到http://download.csdn.net/detail/whatismvc/5994343下载。

    Java DateUtil时间工具类

    Java中的DateUtil时间工具类是开发者在处理日期和时间时常用的一个自定义工具类。它通常包含了一系列静态方法,用于简化Java内置的日期和时间API的使用,提高代码的可读性和可维护性。在实际开发中,由于Java 8之前...

    DateUtil(日期工具类)

    在Java编程语言中,`DateUtil`通常是一个自定义的工具类,用于处理与日期和时间相关的操作。这个工具类可以极大地简化日期处理任务,提供比Java内置的`java.util.Date`和`java.time`包更友好的API。在本文中,我们将...

    飞龙Java工具类

    DateUtil工具类可能提供了一些便捷的方法,如快速格式化日期、计算两个日期之间的差值、获取当前日期与时间等。例如,`DateUtil.formatDate()`可以将日期对象转换为指定格式的字符串,`DateUtil.between()`用于计算...

    DateUtil java日期工具类

    个人整理的java的关于Date对象的日期时间处理工具类,若存在问题还望大家在评论中提出,我将一直进行修改维护

    Java日期操作方法工具类实例【包含日期比较大小,相加减,判断,验证,获取年份等】

    DateUtil 工具类提供了 isLeapYear 方法,用于判断是否是润年。该方法通过对年份进行判断,来确定是否是润年。 日期相加减 DateUtil 工具类还提供了日期相加减的操作。例如,可以使用 Calendar 对象来对日期进行加...

    Java - DateUtil 日期时间转换工具类

    资源名称:DateUtil 日期时间转换工具类 内容概要:日期时间转换工具类,包括基本的Date类型,String类型,TimeStamp类型,LocalDateTime类型,LocalDate类型之间的互相转换,还提供了许多与时间获取,时间计算有关...

Global site tag (gtag.js) - Google Analytics