Java日期处理工具类

该工具类包含了如下功能:

  • 日期格式化yyyy-MM-dd
  • 日期格式化yyyy-MM-dd HH:mm:ss
  • 获取当前日期(yyyy-MM-dd)
  • 日期时间毫秒级格式化
  • 获取日期星期一日期
  • 获取日期星期日日期
  • 获取月的第一天
  • 获取月的最后一天
  • 获取当前年
  • 获取当前月份
  • 获取当月天数
  • 现在是本周中第几天
  • 现在是本月中第几天
  • 现在是一年中第几天
  • 现在是一天中第几小时
  • 现在是一年中第几小时
  • 一年中第几秒
  • 比较日期大小
  • Java将Unix时间戳转换成指定格式日期字符串
import java.io.Serializable;
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.Locale;
import java.util.Map;
import java.util.regex.Pattern;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 日期工具类
 * @author MrXiao
 * @version 1.0.0
 */
public class DateUtil implements Serializable {
	private static Logger logger = LoggerFactory.getLogger(DateUtil.class);
	
    /***/
    private static final long serialVersionUID = 1L;

    /**
     * 默认短日期格式
     * yyyy-MM-dd
     */
    public static final String DATE_DEFAULT_FORMAT = "yyyy-MM-dd";
    
    /** 
     * 订单号前缀 yyyyMMddHHmmss
     */
    public static final String DATETIME_ORDER_FORMAT = "yyyyMMddHHmmss";
    /**
     * 默认日期时间格式
     * yyyy-MM-dd HH:mm:ss
     */
    public static final String DATETIME_DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
    /**
     * 默认时间格式
     * HH:mm:ss
     */
    public static final String TIME_DEFAULT_FORMAT = "HH:mm:ss";
    /**
     * 默认日期短格式
     * yyyyMMdd
     */
    public static final String DATE_DEFAULT_SHORT_FORMAT = "yyyyMMdd";

    /**
     * 默认短日期格格式化
     */
    private static DateFormat dateFormat = new SimpleDateFormat(DATE_DEFAULT_FORMAT);
    /**
     * 默认日期时间格式化
     */
    private static DateFormat dateTimeFormat = new SimpleDateFormat(DATETIME_DEFAULT_FORMAT);
    /**
     * 默认时间格式化
     */
    private static DateFormat timeFormat = new SimpleDateFormat(TIME_DEFAULT_FORMAT);

    /**
     * 日历
     */
    private static Calendar gregorianCalendar = new GregorianCalendar();
    /**
     * 日期正则格式
     */
    private static Map<String, String> dateRegFormat = new HashMap<String, String>();

    /** 锁对象 */
    private static final Object lockObj = new Object();

    /** 存放不同的日期模板格式的sdf的Map */
    private static Map<String, ThreadLocal<SimpleDateFormat>> sdfMap = new HashMap<String, ThreadLocal<SimpleDateFormat>>();
    
    static {
        dateRegFormat.put(
                "^\\d{4}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D*$",
                "yyyy-MM-dd-HH-mm-ss");
        dateRegFormat.put(
                "^\\d{4}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D*$",
                "yyyy-MM-dd-HH-mm-ss");//2017年3月12日 12时05分34秒,2017-03-12 12:05:34,2017/3/12 12:5:34
        dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}$",
                "yyyy-MM-dd-HH-mm");//2017-03-12 12:05
        dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}$",
                "yyyy-MM-dd-HH");//2017-03-12 12
        dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}$", "yyyy-MM-dd");//2017-03-12
        dateRegFormat.put("^\\d{4}\\D+\\d{2}$", "yyyy-MM");//2017-03
        dateRegFormat.put("^\\d{4}$", "yyyy");//2017
        dateRegFormat.put("^\\d{14}$", "yyyyMMddHHmmss");//20170312120534
        dateRegFormat.put("^\\d{12}$", "yyyyMMddHHmm");//201703121205
        dateRegFormat.put("^\\d{10}$", "yyyyMMddHH");//2017031212
        dateRegFormat.put("^\\d{8}$", "yyyyMMdd");//20170312
        dateRegFormat.put("^\\d{6}$", "yyyyMM");//201703
        dateRegFormat.put("^\\d{2}\\s*:\\s*\\d{2}\\s*:\\s*\\d{2}$",
                "yyyy-MM-dd-HH-mm-ss");//13:05:34 拼接当前日期
        dateRegFormat.put("^\\d{2}\\s*:\\s*\\d{2}$", "yyyy-MM-dd-HH-mm");//13:05 拼接当前日期
        dateRegFormat.put("^\\d{2}\\D+\\d{1,2}\\D+\\d{1,2}$", "yy-MM-dd");//16.10.18(年.月.日)
        dateRegFormat.put("^\\d{1,2}\\D+\\d{1,2}$", "yyyy-dd-MM");//30.12(日.月) 拼接当前年份
        dateRegFormat.put("^\\d{1,2}\\D+\\d{1,2}\\D+\\d{4}$", "dd-MM-yyyy");//12.21.2016(日.月.年)
    }
    
    /**
	 * ron
     * 解决SimpleDateFormat静态化的坑
     * 返回一个ThreadLocal的sdf,每个线程只会new一次sdf
     * @param pattern
     * @return
     */
    private static SimpleDateFormat getSimpleDateFormat(final String pattern) {
        ThreadLocal<SimpleDateFormat> tl = sdfMap.get(pattern);

        // 双检锁是防止sdfMap这个单例被多次put重复的sdf
        if (tl == null) {
            synchronized (lockObj) {
                tl = sdfMap.get(pattern);
                if (tl == null) {
                   
                    // 使用ThreadLocal<SimpleDateFormat>替代原来直接new SimpleDateFormat
                    tl = new ThreadLocal<SimpleDateFormat>() {

                        @Override
                        protected SimpleDateFormat initialValue() {
                            System.out.println("thread: " + Thread.currentThread() + " init pattern: " + pattern);
                            return new SimpleDateFormat(pattern);
                        }
                    };
                    // 只有Map中还没有这个pattern的sdf才会生成新的sdf并放入map
                    sdfMap.put(pattern, tl);
                }
            }
        }
        return tl.get();
    }
    

    /**
     * TODO 将各种日期格式转为  yyyy-MM-dd HH:mm:ss
     *
     * @param dateStr
     * @return
     * @author MrXiao
     * @date 2017年3月13日 下午6:13:45
     */
    public static String formatDate(String dateStr) {
        String curDate = new SimpleDateFormat(DATE_DEFAULT_FORMAT).format(new Date());
        DateFormat formatter1 = new SimpleDateFormat(DATETIME_DEFAULT_FORMAT);
        DateFormat formatter2;
        String result = "";
        try {
            for (String key : dateRegFormat.keySet()) {
                if (Pattern.compile(key).matcher(dateStr).matches()) {
                    formatter2 = new SimpleDateFormat(dateRegFormat.get(key));
                    if (key.equals("^\\d{2}\\s*:\\s*\\d{2}\\s*:\\s*\\d{2}$")
                            || key.equals("^\\d{2}\\s*:\\s*\\d{2}$")) {//13:05:34 或 13:05 拼接当前日期
                        dateStr = curDate + "-" + dateStr;
                    } else if (key.equals("^\\d{1,2}\\D+\\d{1,2}$")) {//21.1 (日.月) 拼接当前年份
                        dateStr = curDate.substring(0, 4) + "-" + dateStr;
                    }

                    result = formatter1.format(formatter2.parse(dateStr.replaceAll("\\D+", "-")));
                    break;
                }
            }
        } catch (Exception e) {
            System.err.println("-----------------日期格式无效:" + dateStr);
        }
        return result;
    }

    /**
     * 日期格式化
     * @param date	日期格式字符串
     * @param format 日期格式
     * @return
     */
    public static Date formatDate(String date, String format) {
        try {
            return new SimpleDateFormat(format).parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 日期格式化
     * @date 2017年5月10日 下午2:46:44
     * @param date 日期
     * @param format 日期格式
     * @return
     */
    public static Date formatDate(Date date, String format) {
    	String sdate = getDateFormat(date, format);
    	return formatDate(sdate, format);
    }
    /**
     * 日期格式化yyyy-MM-dd
     *
     * @param date
     * @return
     */
    public static String getDateFormat(Date date) {
    	if(date == null) {
    		return null;
    	}
        return dateFormat.format(date);
    }

    /**
     * 日期格式化yyyy-MM-dd HH:mm:ss
     *
     * @param date
     * @return
     */
    public static String getDateTimeFormat(Date date) {
    	if(date == null) {
    		return null;
    	}
        return dateTimeFormat.format(date);
    }

    /**
     * 时间格式化
     *
     * @param date
     * @return HH:mm:ss
     */
    public static String getTimeFormat(Date date) {
    	if(date == null) {
    		return null;
    	}
        return timeFormat.format(date);
    }

    /**
     * 日期格式化
     *
     * @param date
     * @param 格式类型
     * @return
     */
    public static String getDateFormat(Date date, String format) {
        if (StringUtil.isNotEmpty(format)) {
            return new SimpleDateFormat(format).format(date);
        }
        return null;
    }

    /**
     * 日期格式化 yyyy-MM-dd
     *
     * @param date
     * @return
     */
    public static Date getDateFormat(String date) {
        try {
            return dateFormat.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 时间格式化 yyyy-MM-dd HH:mm:ss
     *
     * @param date
     * @return
     */
    public static Date getDateTimeFormat(String date) {
        try {
            return dateTimeFormat.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取当前日期(yyyy-MM-dd)
     *
     * @param date
     * @return
     */
    public static Date getNowDate() {
        return DateUtil.getDateFormat(dateFormat.format(new Date()));
    }

    /**
     * 日期时间毫秒级格式化
     *
     * @param time 日期
     * @param 格式类型 yyyy-MM-dd HH:mm:ss.SSS
     * @return
     */
    public static String getDateTimeMillisFormat(long time) {
    	return getDateTimeMillisFormat(new Date(time)) ;
    }

    /**
     * 日期时间毫秒级格式化
     *
     * @param date 日期
     * @param 格式类型 yyyy-MM-dd HH:mm:ss.SSS
     * @return
     */
    public static String getDateTimeMillisFormat(Date date) {
    	return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(date);
    }

    /**
     * 获取当前日期星期一日期
     *
     * @return date
     */
    public static Date getFirstDayOfWeek() {
        gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        gregorianCalendar.setTime(new Date());
        gregorianCalendar.set(Calendar.DAY_OF_WEEK, gregorianCalendar.getFirstDayOfWeek()); // Monday
        return gregorianCalendar.getTime();
    }

    /**
     * 获取当前日期星期日日期
     *
     * @return date
     */
    public static Date getLastDayOfWeek() {
        gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        gregorianCalendar.setTime(new Date());
        gregorianCalendar.set(Calendar.DAY_OF_WEEK, gregorianCalendar.getFirstDayOfWeek() + 6); // Monday
        return gregorianCalendar.getTime();
    }

    /**
     * 获取日期星期一日期
     *
     * @param 指定日期
     * @return date
     */
    public static Date getFirstDayOfWeek(Date date) {
        if (date == null) {
            return null;
        }
        gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        gregorianCalendar.setTime(date);
        gregorianCalendar.set(Calendar.DAY_OF_WEEK, gregorianCalendar.getFirstDayOfWeek()); // Monday
        return gregorianCalendar.getTime();
    }

    /**
     * 获取日期星期一日期
     *
     * @param 指定日期
     * @return date
     */
    public static Date getLastDayOfWeek(Date date) {
        if (date == null) {
            return null;
        }
        gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        gregorianCalendar.setTime(date);
        gregorianCalendar.set(Calendar.DAY_OF_WEEK, gregorianCalendar.getFirstDayOfWeek() + 6); // Monday
        return gregorianCalendar.getTime();
    }

    /**
     * 获取当前月的第一天
     *
     * @return date
     */
    public static Date getFirstDayOfMonth() {
        gregorianCalendar.setTime(new Date());
        gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
        return gregorianCalendar.getTime();
    }

    /**
     * 获取当前月的最后一天
     *
     * @return
     */
    public static Date getLastDayOfMonth() {
        gregorianCalendar.setTime(new Date());
        gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
        gregorianCalendar.add(Calendar.MONTH, 1);
        gregorianCalendar.add(Calendar.DAY_OF_MONTH, -1);
        return gregorianCalendar.getTime();
    }

    /**
     * 获取指定月的第一天
     *
     * @param date
     * @return
     */
    public static Date getFirstDayOfMonth(Date date) {
        gregorianCalendar.setTime(date);
        gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
        return gregorianCalendar.getTime();
    }
    /**
     * Java将Unix时间戳转换成指定格式日期字符串
     * @param timestampString 时间戳 如:"1473048265";
     * @param formats 要格式化的格式 默认:"yyyy-MM-dd HH:mm:ss";
     *
     * @return 返回结果 如:"2016-09-05 16:06:42";
     */
    public static String timeStamp2Date(String timestampStr, String formats) {
        if (StringUtil.isEmpty(formats))
            formats = "yyyy-MM-dd HH:mm:ss";
        Long timestamp = Long.parseLong(timestampStr) * 1000;
        String date = new SimpleDateFormat(formats, Locale.CHINA).format(new Date(timestamp));
        return date;
    }
    /**
     * 获取指定月的最后一天
     *
     * @param date
     * @return
     */
    public static Date getLastDayOfMonth(Date date) {
        gregorianCalendar.setTime(date);
        gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
        gregorianCalendar.add(Calendar.MONTH, 1);
        gregorianCalendar.add(Calendar.DAY_OF_MONTH, -1);
        return gregorianCalendar.getTime();
    }

    /**
     * 获取日期前一天
     *
     * @param date
     * @return
     */
    public static Date getDayBefore(Date date) {
        gregorianCalendar.setTime(date);
        int day = gregorianCalendar.get(Calendar.DATE);
        gregorianCalendar.set(Calendar.DATE, day - 1);
        return gregorianCalendar.getTime();
    }

    /**
     * 获取日期后一天
     *
     * @param date
     * @return
     */
    public static Date getDayAfter(Date date) {
        gregorianCalendar.setTime(date);
        int day = gregorianCalendar.get(Calendar.DATE);
        gregorianCalendar.set(Calendar.DATE, day + 1);
        return gregorianCalendar.getTime();
    }

    /**
     * 获取当前年
     *
     * @return
     */
    public static int getNowYear() {
        Calendar d = Calendar.getInstance();
        return d.get(Calendar.YEAR);
    }

    /**
     * 获取当前月份
     *
     * @return
     */
    public static int getNowMonth() {
        Calendar d = Calendar.getInstance();
        return d.get(Calendar.MONTH) + 1;
    }

    /**
     * 获取当月天数
     *
     * @return
     */
    public static int getNowMonthDays() {
        Calendar d = Calendar.getInstance();
        return d.getActualMaximum(Calendar.DATE);
    }

    /**
     * 现在是本周中第几天
     * @return
     */
	public static int getNowDayOfWeek() {
		Calendar d = Calendar.getInstance();
		return d.get(Calendar.DAY_OF_WEEK);
	}
	
    /**
     * 现在是本月中第几天
     * @return
     */
	public static int getNowDayOfMonth() {
		Calendar d = Calendar.getInstance();
		return d.get(Calendar.DAY_OF_MONTH);
	}
	
    /**
     * 现在是一年中第几天
     * @return
     */
	public static int getNowDayOfYear() {
		Calendar d = Calendar.getInstance();
		return d.get(Calendar.DAY_OF_YEAR);
	}
	
	/**
	 * 现在是一天中第几小时
	 * @return
	 */
	public static int getNowHourOfDay() {
		Calendar d = Calendar.getInstance();
		return d.get(Calendar.HOUR_OF_DAY);
	}
	/**
	 * 现在是一年中第几小时
	 * @return
	 */
	public static int getNowHourOfYear() {
		int days = getNowDayOfYear();
		int hours = getNowHourOfDay();
		
		return 24 * days + hours;
	}
    

	/**
	 * 一年中第几小时
	 * 
	 * @return
	 */
	public static String formatHourOfYear() {
		Calendar d = Calendar.getInstance();
		int day = d.get(Calendar.DAY_OF_YEAR);
		int hour = d.get(Calendar.HOUR_OF_DAY);
		hour = 24 * day + hour;
		return String.format("%04d", hour);
	}

	/**
	 * 一年中的第几分钟
	 * 
	 * @return
	 */
	public static String formatMinuteOfYear() {
		Calendar d = Calendar.getInstance();
		int day = d.get(Calendar.DAY_OF_YEAR);
		int hour = d.get(Calendar.HOUR_OF_DAY);
		int minute = d.get(Calendar.MINUTE);
		minute = 60 * 24 * day + 60 * (hour - 1) + minute;
		return String.format("%06d", minute);
	}

	/**
	 * 一年中第几秒
	 * 
	 * @return
	 */
	public static String formatSecondOfYear() {
		Calendar d = Calendar.getInstance();
		int day = d.get(Calendar.DAY_OF_YEAR);
		int hour = d.get(Calendar.HOUR_OF_DAY);
		int minute = d.get(Calendar.MINUTE);
		int second = d.get(Calendar.SECOND);
		second = 60 * (60 * 24 * day + 60 * (hour - 1) + 60 * (minute - 1)) + second;
		return String.format("%08d", second);
	}
	
    /**
     * 获取时间段的每一天
     *
     * @param 开始日期
     * @param 结算日期
     * @return 日期列表
     */
    public static List<Date> getEveryDay(Date startDate, Date endDate) {
        if (startDate == null || endDate == null) {
            return null;
        }
        // 格式化日期(yy-MM-dd)
        startDate = DateUtil.getDateFormat(DateUtil.getDateFormat(startDate));
        endDate = DateUtil.getDateFormat(DateUtil.getDateFormat(endDate));
        List<Date> dates = new ArrayList<Date>();
        gregorianCalendar.setTime(startDate);
        dates.add(gregorianCalendar.getTime());
        while (gregorianCalendar.getTime().compareTo(endDate) < 0) {
            // 加1天
            gregorianCalendar.add(Calendar.DAY_OF_MONTH, 1);
            dates.add(gregorianCalendar.getTime());
        }
        return dates;
    }

    /**
     * 获取提前多少个月
     *
     * @param monty
     * @return
     */
    public static Date getFirstMonth(int monty) {
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MONTH, -monty);
        return c.getTime();
    }
    
    /**
     * 
     * TODO 比较日期大小
     * @author MrXiao
     * @date 2017年3月17日 下午5:19:02
     * @param sdate1
     * @param sdate2
     * @return sdate1大于sdate2, 返回 1; </br>
     * 		sdate1等于sdate2, 返回 0; </br>
     * 		sdate1小于sdate2, 返回 -1; </br>
     */
    public static int compareDate(String sdate1, String sdate2) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date date1 = df.parse(sdate1);
            Date date2 = df.parse(sdate2);
            if (date1.getTime() > date2.getTime()) {
                return 1;
            } else if (date1.getTime() < date2.getTime()) {
                return -1;
            } else {
                return 0;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }
    /**
     * 
     * TODO 比较日期大小
     * @author MrXiao
     * @date 2017年3月17日 下午5:25:30
     * @param date1
     * @param sdate
     * @return date1大于sdate, 返回 1; </br>
     * 		date1等于sdate, 返回 0; </br>
     * 		date1小于sdate, 返回 -1; </br>
     */
    public static int compareDate(Date date1, String sdate) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date date2 = df.parse(sdate);
            if (date1.getTime() > date2.getTime()) {
                return 1;
            } else if (date1.getTime() < date2.getTime()) {
                return -1;
            } else {
                return 0;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }
    /**
     * 
     * TODO 比较日期大小
     * @author MrXiao
     * @date 2017年3月17日 下午5:27:17
     * @param date1
     * @param date2
     * @return date1大于date2, 返回 1; </br>
     * 		date1等于date2, 返回 0; </br>
     * 		date1小于date2, 返回 -1; </br>
     */
    public static int compareDate(Date date1, Date date2) {
        try {
            if (date1.getTime() > date2.getTime()) {
                return 1;
            } else if (date1.getTime() < date2.getTime()) {
                return -1;
            } else {
                return 0;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }

    /**
     * 
     * TODO 返回日期之间相差的天数
     * @author MrXiao
     * @date 2017年3月17日 下午5:29:49
     * @param smdate
     * @param bdate
     * @return
     */
    public static int daysBetween(String smdate, String bdate) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        long time1 = 0;
        long time2 = 0;

        try {
            cal.setTime(sdf.parse(smdate));
            time1 = cal.getTimeInMillis();
            cal.setTime(sdf.parse(bdate));
            time2 = cal.getTimeInMillis();
        } catch (Exception e) {
            e.printStackTrace();
        }
        long between_days = (time2 - time1) / (1000 * 3600 * 24);
        return Integer.parseInt(String.valueOf(between_days));
    }

    public static int daysBetween(Date dt1, Date dt2) {
        Calendar cal = Calendar.getInstance();
        long time1 = 0;
        long time2 = 0;

        try {
            cal.setTime(dt1);
            time1 = cal.getTimeInMillis();
            cal.setTime(dt2);
            time2 = cal.getTimeInMillis();
        } catch (Exception e) {
            e.printStackTrace();
        }
        long between_days = (time2 - time1) / (1000 * 3600 * 24);
        return Integer.parseInt(String.valueOf(between_days));
    }

    // String日期转Date
    public static Date convertString2Date(String strDate) {
        try {
            return dateTimeFormat.parse(strDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new Date();
    }
    
    /**
	 * @param aDate
	 * @param pattern: Date format pattern
	 * @return
	 */
	public static final <T extends Date> String format(T date, String pattern) {
		if(date==null) return null;
		try{
			SimpleDateFormat df = new SimpleDateFormat(pattern,java.util.Locale.CHINA);
			String result = df.format(date);
			return result;
		}catch(Exception e){
			return null;
		}
	}
	
	/**
	 * 获取当前日期
	 * 
	 * @param patten 日期格式,如:yyyy-MM-dd HH:mm:ss
	 * @return
	 */
	public static String getDateStr(String pattern) {
		String date = getSimpleDateFormat(pattern).format(new Date(System.currentTimeMillis()));
		return date;
	}
	
    
    public static Calendar getTime() {
    	Calendar time=Calendar.getInstance();
    	return time;
    }
    
    public static Calendar getTime(long timeMillis) {
    	Calendar time=getTime();
    	time.setTimeInMillis(timeMillis);
    	return time;
    }
    public static Date getDate() {
    	return getTime().getTime();
    }
    public static Date getDate(long timeMillis) {
    	return getTime(timeMillis).getTime();
    }
    
    public static String getYYYYMMDD() {
    	return getSimpleDateFormat("yyyyMMdd").format(getDate());
    }
    public static String getYYYYMMDD(long time) {
    	return getSimpleDateFormat("yyyyMMdd").format(getDate(time));
    }
    public static String getHHmmss() {
    	return getSimpleDateFormat("HHmmss").format(getDate());
    }
    public static String getYYYYMM() {
    	return getSimpleDateFormat("yyyyMM").format(getDate());
    }
    public static String getYYYYMM(long timeMillis) {
    	return getSimpleDateFormat("yyyyMM").format(getDate(timeMillis));
    }
    public static String getMMDD() {
    	return getSimpleDateFormat("MMdd").format(getTime());
    }
    public static String getMMDD(long timeMillis) {
    	return getSimpleDateFormat("MMdd").format(getDate(timeMillis));
    }
    public static String getDD(long timeMillis) {
    	return getSimpleDateFormat("dd").format(getDate(timeMillis));
    }
    
    /**
	 * 日期格式化(String转换为Date)
	 * 
	 * @param dateStr
	 *            日期字符串
	 * @param patten
	 *            处理结果日期的显示格式,如:"YYYY-MM-DD"
	 * @return
	 */
	public static Date getDateToString(String dateStr, String patten) {
		if(StringUtil.isBlank(dateStr)){
			return null;
		}
		try {
			return getSimpleDateFormat(patten).parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
    
    /**
     * 转换日期
     * @param date
     * @return
     */
	public static Calendar getCalendar(Date date) {
		if (date == null) {
			return null;
		}
		Calendar calendar = GregorianCalendar.getInstance();
		calendar.setTime(date);
		return calendar;
	}
	/**
	 * 
	 * TODO 计算昨天或上周五15点
	 * @author xiezb
	 * @date 2016年9月22日 上午10:04:48
	 * @param date
	 * @return 计算昨天或上周五15点
	 */
	public static Date calcYesterdayOrLastFriday15OClock(Date date) {
		//某一天
		Date oneDate = date;
		//今天周几
		int weekDay = getWeek(date);		
		//date是周一
		if(weekDay == 1){
			//某一天
			oneDate = addDays(oneDate, -3);
		} else {
			//某一天
			oneDate = addDays(date, -1);
		}
		
		//某一天
		String sOneDay = getDateFormat(oneDate, DATE_DEFAULT_FORMAT);		
		//某一天15点
		String sOneDay15 = sOneDay+" 15:00:00";
		
		return formatDate(sOneDay15, DATETIME_DEFAULT_FORMAT);
	}
	/**
	 * 
	 * TODO 计算某一天15点
	 * @author xiezb
	 * @date 2016年9月22日 上午11:58:37
	 * @param date 日期
	 * @param days 天数
	 * @return
	 */
	public static Date calcOneDay15OClock(Date date, int days) {
		//某一天
		Date oneDate = addDays(date, days);
		//某一天
		String sOneDay = getDateFormat(oneDate, DATE_DEFAULT_FORMAT);		
		//某一天15点
		String sOneDay15 = sOneDay+" 15:00:00";
		
		return formatDate(sOneDay15, DATETIME_DEFAULT_FORMAT);
	}
	
	/**
	 * 年份
	 * 
	 * @param date
	 * @return
	 */
	public static int getYear(Date date) {
		if (date == null) {
			return -1;
		}
		Calendar calendar = getCalendar(date);
		return calendar.get(Calendar.YEAR);
	}

	/**
	 * 月份
	 * 
	 * @param date
	 * @return
	 */
	public static int getMonth(Date date) {
		if (date == null) {
			return -1;
		}
		Calendar calendar = getCalendar(date);
		return calendar.get(Calendar.MONTH) + 1;
	}

	/**
	 * 本年的第几天
	 * 
	 * @param date
	 * @return
	 */
	public static int getDayOfYear(Date date) {
		if (date == null) {
			return -1;
		}
		Calendar calendar = getCalendar(date);
		return calendar.get(Calendar.DAY_OF_YEAR);
	}

	/**
	 * 本月的第几天
	 * 
	 * @param date
	 * @return
	 */
	public static int getDayOfMonth(Date date) {
		if (date == null) {
			return -1;
		}
		Calendar calendar = getCalendar(date);
		return calendar.get(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 本周第几天(周几)
	 * 
	 * @param date
	 * @return
	 */
	public static int getWeek(Date date) {
		if (date == null) {
			return -1;
		}
		Locale.setDefault(Locale.CHINA);
		Calendar calendar = getCalendar(date);

		return calendar.get(Calendar.DAY_OF_WEEK) - 1;
	}

	/**
	 * 返回小时
	 * 
	 * @param date
	 * @return
	 */
	public static int getHour(Date date) {
		Calendar calendar = getCalendar(date);
		return calendar.get(Calendar.HOUR_OF_DAY);
	}

	/**
	 * 返回分钟
	 * 
	 * @param date
	 * @return
	 */
	public static int getMinute(Date date) {
		Calendar calendar = getCalendar(date);
		return calendar.get(Calendar.MINUTE);
	}

	/**
	 * 返回秒钟
	 * 
	 * @param date
	 * @return
	 */
	public static int getSecond(Date date) {
		Calendar calendar = getCalendar(date);
		return calendar.get(Calendar.SECOND);
	}

	/**
	 * 返回毫秒
	 * 
	 * @param date
	 * @return
	 */
	public static long getMillis(Date date) {
		Calendar calendar = getCalendar(date);
		return calendar.getTimeInMillis();
	}

	/**
	 * 返回两个日期之间的相隔毫秒数
	 *
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static long getMillisBetween(Date d1, Date d2) {
		long s = getCalendar(d1).getTimeInMillis();
		long e = getCalendar(d2).getTimeInMillis();
		return Math.abs(e - s);
	}

	/**
	 * 返回两个日期之间的相隔分钟
	 *
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static long getMiniteBetween(Date d1, Date d2) {
		long s = getCalendar(d1).getTimeInMillis();
		long e = getCalendar(d2).getTimeInMillis();
		return Math.abs(e - s) / (1000 * 60);
	}

	/**
	 * 获取两个日期之间的天数:cal2 - cal1
	 * 
	 * @param cal1
	 * @param cal2
	 * @return
	 */
	public static int getDaysBetween(Calendar cal1, Calendar cal2) {
		boolean flag = true;
		int days = cal2.get(Calendar.DAY_OF_YEAR) - cal1.get(Calendar.DAY_OF_YEAR);
		int year2 = cal2.get(Calendar.YEAR);
		int year1 = cal1.get(Calendar.YEAR);

		if (year2 < year1) {
			flag = false;
		}
		if (year1 != year2) {
			do {
				days += cal1.getActualMaximum(Calendar.DAY_OF_YEAR);
				if (flag) {
					cal1.add(Calendar.YEAR, 1);
				} else {
					cal1.add(Calendar.YEAR, -1);
				}
			} while (cal1.get(Calendar.YEAR) != year2);
		}
		if (flag) {
			return days;
		}
		return -days;
	}

	public static int getDaysAbsBetween(Date date1, Date date2) {
		return Math.abs(getDaysBetween(getCalendar(date1), getCalendar(date2)));
	}

	/**
	 * 获取两个日期之间的天数:date2 - date1
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static int getDaysBetween(Date date1, Date date2) {
		return getDaysBetween(getCalendar(date1), getCalendar(date2));
	}

	/**
	 * 获取两个日期之间相隔月份 cal2 - cal1
	 * 
	 * @param cal1
	 * @param cal2
	 * @return
	 */
	public static int getMonthsBetween(Calendar cal1, Calendar cal2) {
		int months = cal2.get(Calendar.MONTH) - cal1.get(Calendar.MONTH);
		boolean flag = true;

		int year2 = cal2.get(Calendar.YEAR);
		int year1 = cal1.get(Calendar.YEAR);

		if (year2 < year1)
			flag = false;
		if (year1 != year2) {
			do {
				months += cal1.getActualMaximum(Calendar.MONTH) + 1;
				if (flag)
					cal1.add(Calendar.YEAR, 1);
				else
					cal1.add(Calendar.YEAR, -1);
			} while (cal1.get(Calendar.YEAR) != year2);
		}
		if (flag) {
			return months;
		}
		return -months;
	}

	/**
	 * 获取两个日期相隔的月份 date2 - date1
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static int getMonthsBetween(Date date1, Date date2) {
		return getMonthsBetween(getCalendar(date1), getCalendar(date2));
	}

	/**
	 * 获取两个日期相隔年份 cal2 - cal1
	 * 
	 * @param cal1
	 * @param cal2
	 * @return
	 */
	public static int getYearsBetween(Calendar cal1, Calendar cal2) {
		int year2 = cal2.get(1);
		int year1 = cal1.get(1);
		return year2 - year1;
	}

	/**
	 * 获取两个日期相隔年份 date2 - date1
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static int getYearsBetween(Date date1, Date date2) {
		return getYearsBetween(getCalendar(date1), getCalendar(date2));
	}

	/**
	 * 获取给定日期n天后(前)的日期
	 * 
	 * @param date
	 * @param days
	 * @return
	 */
	public static Date addDays(Date date, int n) {
		if (date == null) {
			return null;
		}
		Calendar calendar = GregorianCalendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, n);
		return calendar.getTime();
	}

	/**
	 * 获取给定日期n个月后(前)的日期
	 * 
	 * @param date
	 * @param months
	 * @return
	 */
	public static Date addMonths(Date date, int n) {
		if (date == null) {
			return null;
		}
		Calendar calendar = GregorianCalendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, n);
		return calendar.getTime();
	}

	/**
	 * 获取给定日期n年后(前)的日期
	 * 
	 * @param date
	 * @param years
	 * @return
	 */
	public static Date addYears(Date date, int n) {
		if (date == null) {
			return null;
		}
		Calendar calendar = GregorianCalendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.YEAR, n);
		return calendar.getTime();
	}

	/**
	 * 获取给定日期n小时后(前)的日期
	 * 
	 * @param date
	 * @param hours
	 * @return
	 */
	public static Date addHours(Date date, int n) {
		Calendar calendar = GregorianCalendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.HOUR_OF_DAY, n);
		return calendar.getTime();
	}

	/**
	 * 获取给定日期n分钟后(前)的日期
	 * 
	 * @param date
	 * @param minutes
	 * @return
	 */
	public static Date addMinutes(Date date, int n) {
		Calendar calendar = GregorianCalendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MINUTE, n);
		return calendar.getTime();
	}

	/**
	 * 获取给定日期n秒后(前)的日期
	 * 
	 * @param date
	 * @param seconds
	 * @return
	 */
	public static Date addSeconds(Date date, int n) {
		Calendar calendar = GregorianCalendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.SECOND, n);
		return calendar.getTime();
	}

	/**
	 * 获取上个月第一天
	 * 
	 * @return
	 */
	public static Date getLastMonthFirstDay() {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, -1);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		return calendar.getTime();
	}

	/**
	 * 获取上个月最后一天
	 * 
	 * @return
	 */
	public static Date getLastMonthLastDay() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		calendar.add(Calendar.DATE, -1);
		return calendar.getTime();
	}
	
	/**
	 * 获取当前月第一天
	 * 
	 * @return
	 */
	public static Date getCurMonthFirstDay() {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, 0);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		return calendar.getTime();
	}

	/**
	 * / 获取前月的最后一天
	 * 
	 * @return
	 */
	public static Date getCurMonthLastDay() {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, 1);
		calendar.set(Calendar.DAY_OF_MONTH, 0);
		return calendar.getTime();
	}

	/**
	 * 获取给定时间所在月份的第一天
	 * @param date
	 * @return
	 */
	public static Date getSpecifyDateMonthFirstDay(Date date){
		Calendar calendar = getCalendar(date);
		calendar.add(Calendar.MONTH, 0);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		return calendar.getTime();
	}
	public static Date getSpecifyDateMonthLastDay(Date date){
		Calendar calendar = getCalendar(date);
		calendar.add(Calendar.MONTH, 1);
		calendar.set(Calendar.DAY_OF_MONTH, 0);
		return calendar.getTime();
	}
	

	/**
	 * 获取当前年份给定月份的天数
	 * 
	 * @return
	 */
	public static int dayLenOfMonth(int m) {
		if (m == 2) {
			int year = getYear(new Date());
			if (((year % 100 == 0) && (year % 400 == 0)) || ((year % 100 != 0) && (year % 4 == 0))) {
				return 29;
			}
			return 28;
		} else if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
			return 31;
		} else {
			return 30;
		}
	}
	
	
	
	/**
	 * 是否使用平今仓
	 * @param exchangeNo	交易所编码
	 * @param sysBuyDealTime	系统买入成交时间
	 * @return
	 */
	public static boolean isCloseToday(String exchangeNo, Date sysBuyDealTime){
		if(!"SHFE".equalsIgnoreCase(exchangeNo)){
			return false;
		}
		
		if(sysBuyDealTime == null) {
			return false;
		}
		
		//系统买入时间
		long buyTime = sysBuyDealTime.getTime();
		//当前时间
		Date now = new Date();
		//系统平仓时间
		long sysSaleTime = now.getTime();		
		//今天15点		
		Date thisDate15 = DateUtil.calcOneDay15OClock(now, 0);
		//昨天或上周五15点
		Date lastDate15 = DateUtil.calcYesterdayOrLastFriday15OClock(now);
		//明天15点
		Date nextDate15 = DateUtil.calcOneDay15OClock(now, 1);
		
		//上期所闭市时间: [01:00, 02:30, 15:00]
		if(sysSaleTime > lastDate15.getTime() && sysSaleTime <= thisDate15.getTime()) {				
			if(buyTime > lastDate15.getTime() && buyTime < thisDate15.getTime()) {
				//平今: 计算系统平仓参数
				return true;
			} else if(buyTime < lastDate15.getTime()) {
				//平仓: 计算系统平仓参数
				return false;
			}
		} 
		//上期所闭市时间: [23:00]
		else if(sysSaleTime > thisDate15.getTime() && sysSaleTime < nextDate15.getTime()) {
			//平仓
			if(buyTime < thisDate15.getTime()){
				//平仓: 计算系统平仓参数
				return false;
			} else if(buyTime > thisDate15.getTime() && buyTime < nextDate15.getTime()){
				//平今: 计算系统平仓参数
				return true;
			}
		}
		return false;
	}
	
    public static void main(String[] args) {
    	
    	int day = getNowDayOfYear();
    	int dhour = getNowHourOfDay();
    	int yhour = getNowHourOfYear();
    	int wday = getNowDayOfWeek();
    	logger.info("day:{}, wday:{}, dhour:{}, yhour:{}", day, wday, dhour, yhour);
    	
    	Date date = DateUtil.formatDate("20180102 14:25:34", "yyyyMMdd HH:mm:ss");
    	logger.info("time:{}", date.getTime());
    	
	}

}


# 工具 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×