时间工具类

来源:互联网 发布:单身约会软件 编辑:程序博客网 时间:2024/06/05 15:26

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类
 * @author pccc
 *
 */
public class DateTools {
    
    /**
     * 获取当前日期的前一天
     *
     * @param date
     * @return
     */
    public static Date getBeforeDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        date = calendar.getTime();
        return date;
    }

    /**
     * 获取当前日期的后一天
     *
     * @param date
     * @return
     */
    public static Date getNextDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, 1);
        date = calendar.getTime();
        return date;
    }

    /**
     * 获取当前月第一天
     *
     * @param date
     * @return
     */
    public static Date getFirstDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
        return calendar.getTime();
    }

    /**
     * 获取当前月最后一天
     *
     * @param date
     * @return
     */
    public static Date getLastDay(Date date) {
        Calendar ca = Calendar.getInstance();
        ca.set(Calendar.DAY_OF_MONTH,
                ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        return ca.getTime();
    }
    
    /**
     * 获得1970年1月1日0时00分00秒000毫秒到当天指定时间点之间的毫秒数
     * 想获得今天20:00:00:000整的毫秒数:
     * 参数可传:getMilliseconds(20, 0, 0, 0)
     * @author yuan.yu
     * @date 2017-4-28
     * @param calendar
     * @param hour
     * @param minute
     * @param second
     * @param millisecond
     * @return 1970年1月1日0时00分00秒000毫秒到当天指定时间点之间的毫秒数
     */
    public static long getMilliseconds(int hour, int minute, int second, int millisecond) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);
        calendar.set(Calendar.MILLISECOND, millisecond);
        return calendar.getTime().getTime();
    }
    
    /**
     * 获得1970年1月1日0时00分00秒000毫秒到指定时间点之间的毫秒数
     * 比如像获得2017-05-30 20:00:00:000的毫秒数
     * 可传参数:getMilliseconds(2017, 5, 30, 20, 0, 0, 0)
     * @author yuan.yu
     * @date 2017-5-18
     * @param year
     * @param month
     * @param day
     * @param hour
     * @param minute
     * @param second
     * @param millisecond
     * @return 1970年1月1日0时00分00秒000毫秒到指定时间点之间的毫秒数
     */
    public static long getMilliseconds(int year, int month, int day, int hour, int minute, int second, int millisecond) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month-1);
        calendar.set(Calendar.DATE, day);
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);
        calendar.set(Calendar.MILLISECOND, millisecond);
        return calendar.getTime().getTime();
    }
    
    /**
     * 获取格式为:yyyy-MM-dd HH:mm:ss的字符串日期的毫秒数
     * 从1970年1月1日0时00分00秒000毫秒开始
     * @author yuan.yu
     * @date 2017-5-13
     * @param date
     * @return 1970年1月1日0时00分00秒000毫秒到指定时间点之间的毫秒数
     */
    public static long getMilliseconds(String date) {
        int year = Integer.parseInt(date.substring(0,4));
        int month = Integer.parseInt(date.substring(5,7));
        int day = Integer.parseInt(date.substring(8,10));
        int hour = Integer.parseInt(date.substring(11,13));
        int minute = Integer.parseInt(date.substring(14,16));
        int second = Integer.parseInt(date.substring(17,19));
        int millisecond = 0;
        return getMilliseconds(year, month, day, hour, minute, second, millisecond);
    }
    
    /**
     * 获得当天指定时间点与系统当前时间的秒数(系统当前时间大于指定时间时得到负的秒数)
     * 比如想获得今天20:00:00:000与系统当前时间之间的秒数
     * 可传参数:getSecond(20, 0, 0, 0)
     * @author yuan.yu
     * @date 2017-4-28
     * @param hour
     * @param minute
     * @param second
     * @param millisecond
     * @return 当天指定时间点与系统当前时间的秒数(系统当前时间大于指定时间时返回负的秒数)
     */
    public static int getSecond(int hour, int minute, int second, int millisecond) {
        return (int) (getMilliseconds(hour, minute, second, millisecond) - System.currentTimeMillis()) / 1000;
    }
    
    /**
     * 获得本周周日时间
     * @return
     */
    public static Date getSundayOfThisWeek() {
          Calendar cal = Calendar.getInstance();
          int day_of_week = cal.get(Calendar.DAY_OF_WEEK) - 1;
          if (day_of_week == 0){
              day_of_week = 7;
          }
          cal.add(Calendar.DATE, -day_of_week + 7);
          cal.set(cal.get(cal.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),  
                    23, 59, 59);
          return cal.getTime();
    }
    
    /**
     * 获得当天23:59:59的时间
     * @return
     */
    public static Date getEndTimeToday() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(cal.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),  
                23, 59, 59);
        return cal.getTime();
    }
    
    /**
     * 获取当前月最后一天23:59:59的时间
     * @return
     */
    public static Date getLastTimeThisMonth() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_MONTH,
                cal.getActualMaximum(Calendar.DAY_OF_MONTH));
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),  
                23, 59, 59);
        return cal.getTime();
    }
    
    /**
     * 字符串转成日期类型
     *
     * @param date
     * @return
     */
    public static Date StringToDate(String date, String type) {
        SimpleDateFormat sdf = new SimpleDateFormat(type);
        try {
            return sdf.parse(date);
        } catch (ParseException e) {
            return null;
        }
    }
    
    /**
     * 判断指定日期与当前时间是否为同一自然天
     * @author yuan.yu
     * @date 2017-7-26
     * @description
     * @param appointDate 指定的日期
     * @return
     */
    public static boolean theSameDay(Date appointDate) {
        Calendar appointCal = Calendar.getInstance();
        Calendar nowCal = Calendar.getInstance();
        appointCal.setTime(appointDate);
        return appointCal.get(Calendar.YEAR) == nowCal.get(Calendar.YEAR)
                && appointCal.get(Calendar.MONTH) == nowCal.get(Calendar.MONTH)
                && appointCal.get(Calendar.DAY_OF_YEAR) == nowCal.get(Calendar.DAY_OF_YEAR);
    }
    
    /**
     * 判断两个指定日期是否为同一自然天
     * @author yuan.yu
     * @date 2017-7-26
     * @description
     * @param appointDate
     * @param anotherAppointDate
     * @return
     */
    public static boolean theSameDay(Date appointDate, Date anotherAppointDate) {
        Calendar appointCal = Calendar.getInstance();
        Calendar anotherCal = Calendar.getInstance();
        appointCal.setTime(appointDate);
        appointCal.setTime(anotherAppointDate);
        return appointCal.get(Calendar.YEAR) == anotherCal.get(Calendar.YEAR)
                && appointCal.get(Calendar.MONTH) == anotherCal.get(Calendar.MONTH)
                && appointCal.get(Calendar.DAY_OF_YEAR) == anotherCal.get(Calendar.DAY_OF_YEAR);
    }
    
    /**
     * 判断指定时间与当前时间是否在同一自然周
     * @author yuan.yu
     * @date 2017-7-26
     * @description
     * @param appointDate
     * @return
     */
    public static boolean theSameWeek(Date appointDate) {
        Calendar appointCal = Calendar.getInstance();
        Calendar nowCal = Calendar.getInstance();
        // 设置星期一为一个周的第一天
        appointCal.setFirstDayOfWeek(Calendar.MONDAY);
        nowCal.setFirstDayOfWeek(Calendar.MONDAY);
        appointCal.setTime(appointDate);
        return theSameWeek(appointCal, nowCal);
    }
    
    /**
     * 判断两个指定的日期否在同一自然周
     * @author yuan.yu
     * @date 2017-7-26
     * @description
     * @param appointDate
     * @param anotherAppointDate
     * @return
     */
    public static boolean theSameWeek(Date appointDate, Date anotherAppointDate) {
        Calendar appointCal = Calendar.getInstance();
        Calendar anotherCal = Calendar.getInstance();
        // 设置星期一为一个周的第一天
        appointCal.setFirstDayOfWeek(Calendar.MONDAY);
        anotherCal.setFirstDayOfWeek(Calendar.MONDAY);
        appointCal.setTime(appointDate);
        anotherCal.setTime(anotherAppointDate);
        return theSameWeek(appointCal, anotherCal);
    }

    /**
     * 判断两个时间是否在同一自然周内
     * @author yuan.yu
     * @date 2017-7-26
     * @description
     * @param appointCal
     * @param nowCal
     * @param subYear
     * @return
     */
    private static boolean theSameWeek(Calendar appointCal, Calendar nowCal) {
        // 两个日期的年份之差
        int subYear = nowCal.get(Calendar.YEAR) - appointCal.get(Calendar.YEAR);
        // 两个日期的年份之差为0,同时两个日期在同一年中的周数相等
        if (subYear == 0 && nowCal.get(Calendar.WEEK_OF_YEAR) == appointCal.get(Calendar.WEEK_OF_YEAR)) {
            return true;
        }
        // 指定时间的年份比当前时间所在年份少一年,同时指定时间所在月份在其所在年份的最后一个月(12月),同时两个日期在同一年中的周数相等。
        if (subYear == 1 && appointCal.get(Calendar.MONTH) == 11
                && nowCal.get(Calendar.WEEK_OF_YEAR) == appointCal.get(Calendar.WEEK_OF_YEAR)) {
            return true;
        }
        // 当前时间的年份比指定时间所在年份少一年,同时当前时间所在月份是当年最后一个月(12月),同时两个日期在同一年中的周数相等。
        if (subYear == -1 && nowCal.get(Calendar.MONTH) == 11
                && nowCal.get(Calendar.WEEK_OF_YEAR) == appointCal.get(Calendar.WEEK_OF_YEAR)) {
            return true;
        }
        return false;
    }
    
    /**
     * 判断指定时间与当前时间是否处于同一自然月
     * @author yuan.yu
     * @date 2017-7-26
     * @description
     * @param appointDate
     * @return
     */
    public static boolean theSameMonth(Date appointDate) {
        Calendar appointCal = Calendar.getInstance();
        Calendar nowCal = Calendar.getInstance();
        appointCal.setTime(appointDate);
        return appointCal.get(Calendar.YEAR) == nowCal.get(Calendar.YEAR)
                && appointCal.get(Calendar.MONTH) == nowCal.get(Calendar.MONTH);
    }
    
    /**
     * 判断两个指定的时间是否在同一自然月
     * @author yuan.yu
     * @date 2017-7-26
     * @description
     * @param appointDate
     * @param anotherAppointDate
     * @return
     */
    public static boolean theSameMonth(Date appointDate, Date anotherAppointDate) {
        Calendar appointCal = Calendar.getInstance();
        Calendar anotherCal = Calendar.getInstance();
        appointCal.setTime(appointDate);
        appointCal.setTime(anotherAppointDate);
        return appointCal.get(Calendar.YEAR) == anotherCal.get(Calendar.YEAR)
                && appointCal.get(Calendar.MONTH) == anotherCal.get(Calendar.MONTH);
    }
}