首页 > 开发 > Java > 正文

Java日期工具类DateUtils实例详解

2024-07-13 10:14:20
字体:
来源:转载
供稿:网友

在项目开发中,日期是我们必不可少的的一部分,本文将总结代码开发中的关于日期常用的一些方法,以方便自己后期使用。下面直接上菜了:

package com.example.util;  import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List;  /**  * 日期常用方法  *  * @author  *  */ public class DateUtils {    /**    * 常用变量    */   public static final String DATE_FORMAT_FULL = "yyyy-MM-dd HH:mm:ss";   public static final String DATE_FORMAT_YMD = "yyyy-MM-dd";   public static final String DATE_FORMAT_HMS = "HH:mm:ss";   public static final String DATE_FORMAT_HM = "HH:mm";   public static final String DATE_FORMAT_YMDHM = "yyyy-MM-dd HH:mm";   public static final String DATE_FORMAT_YMDHMS = "yyyyMMddHHmmss";   public static final long ONE_DAY_MILLS = 3600000 * 24;   public static final int WEEK_DAYS = 7;   private static final int dateLength = DATE_FORMAT_YMDHM.length();         /**    * 日期转换为制定格式字符串    *    * @param time    * @param format    * @return    */   public static String formatDateToString(Date time, String format) {     SimpleDateFormat sdf = new SimpleDateFormat(format);     return sdf.format(time);   }    /**    * 字符串转换为制定格式日期    * (注意:当你输入的日期是2014-12-21 12:12,format对应的应为yyyy-MM-dd HH:mm    * 否则异常抛出)    * @param date    * @param format    * @return    * @throws ParseException    *       @    */   public static Date formatStringToDate(String date, String format) {     SimpleDateFormat sdf = new SimpleDateFormat(format);     try {       return sdf.parse(date);     } catch (ParseException ex) {       ex.printStackTrace();       throw new RuntimeException(ex.toString());     }   }    /**    * 判断一个日期是否属于两个时段内    * @param time    * @param timeRange    * @return    */   public static boolean isTimeInRange(Date time, Date[] timeRange) {     return (!time.before(timeRange[0]) && !time.after(timeRange[1]));   }    /**    * 从完整的时间截取精确到分的时间    *    * @param fullDateStr    * @return    */   public static String getDateToMinute(String fullDateStr) {     return fullDateStr == null ? null         : (fullDateStr.length() >= dateLength ? fullDateStr.substring(             0, dateLength) : fullDateStr);   }    /**    * 返回指定年度的所有周。List中包含的是String[2]对象 string[0]本周的开始日期,string[1]是本周的结束日期。    * 日期的格式为YYYY-MM-DD 每年的第一个周,必须包含星期一且是完整的七天。    * 例如:2009年的第一个周开始日期为2009-01-05,结束日期为2009-01-11。 星期一在哪一年,那么包含这个星期的周就是哪一年的周。    * 例如:2008-12-29是星期一,2009-01-04是星期日,哪么这个周就是2008年度的最后一个周。    *    * @param year    *      格式 YYYY ,必须大于1900年度 小于9999年    * @return @    */   public static List<String[]> getWeeksByYear(final int year) {     int weeks = getWeekNumOfYear(year);     List<String[]> result = new ArrayList<String[]>(weeks);     int start = 1;     int end = 7;     for (int i = 1; i <= weeks; i++) {       String[] tempWeek = new String[2];       tempWeek[0] = getDateForDayOfWeek(year, i, start);       tempWeek[1] = getDateForDayOfWeek(year, i, end);       result.add(tempWeek);     }     return result;   }    /**    * 计算指定年、周的上一年、周    *    * @param year    * @param week    * @return @    */   public static int[] getLastYearWeek(int year, int week) {     if (week <= 0) {       throw new IllegalArgumentException("周序号不能小于1!!");     }     int[] result = { week, year };     if (week == 1) {       // 上一年       result[1] -= 1;       // 最后一周       result[0] = getWeekNumOfYear(result[1]);     } else {       result[0] -= 1;     }     return result;   }    /**    * 下一个[周,年]    *    * @param year    * @param week    * @return @    */   public static int[] getNextYearWeek(int year, int week) {     if (week <= 0) {       throw new IllegalArgumentException("周序号不能小于1!!");     }     int[] result = { week, year };     int weeks = getWeekNumOfYear(year);     if (week == weeks) {       // 下一年       result[1] += 1;       // 第一周       result[0] = 1;     } else {       result[0] += 1;     }     return result;   }    /**    * 计算指定年度共有多少个周。(从周一开始)    *    * @param year    * @return @    */   public static int getWeekNumOfYear(final int year) {     return getWeekNumOfYear(year, Calendar.MONDAY);   }    /**    * 计算指定年度共有多少个周。    *    * @param year    *      yyyy    * @return @    */   public static int getWeekNumOfYear(final int year, int firstDayOfWeek) {     // 每年至少有52个周 ,最多有53个周。     int minWeeks = 52;     int maxWeeks = 53;     int result = minWeeks;     int sIndex = 4;     String date = getDateForDayOfWeek(year, maxWeeks, firstDayOfWeek);     // 判断年度是否相符,如果相符说明有53个周。     if (date.substring(0, sIndex).equals(year)) {       result = maxWeeks;     }     return result;   }    public static int getWeeksOfWeekYear(final int year) {     Calendar cal = Calendar.getInstance();     cal.setFirstDayOfWeek(Calendar.MONDAY);     cal.setMinimalDaysInFirstWeek(WEEK_DAYS);     cal.set(Calendar.YEAR, year);     return cal.getWeeksInWeekYear();   }    /**    * 获取指定年份的第几周的第几天对应的日期yyyy-MM-dd(从周一开始)    *    * @param year    * @param weekOfYear    * @param dayOfWeek    * @return yyyy-MM-dd 格式的日期 @    */   public static String getDateForDayOfWeek(int year, int weekOfYear,       int dayOfWeek) {     return getDateForDayOfWeek(year, weekOfYear, dayOfWeek, Calendar.MONDAY);   }    /**    * 获取指定年份的第几周的第几天对应的日期yyyy-MM-dd,指定周几算一周的第一天(firstDayOfWeek)    *    * @param year    * @param weekOfYear    * @param dayOfWeek    * @param firstDayOfWeek    *      指定周几算一周的第一天    * @return yyyy-MM-dd 格式的日期    */   public static String getDateForDayOfWeek(int year, int weekOfYear,       int dayOfWeek, int firstDayOfWeek) {     Calendar cal = Calendar.getInstance();     cal.setFirstDayOfWeek(firstDayOfWeek);     cal.set(Calendar.DAY_OF_WEEK, dayOfWeek);     cal.setMinimalDaysInFirstWeek(WEEK_DAYS);     cal.set(Calendar.YEAR, year);     cal.set(Calendar.WEEK_OF_YEAR, weekOfYear);     return formatDateToString(cal.getTime(), DATE_FORMAT_YMD);   }    /**    * 获取指定日期星期几    *    * @param datetime    * @throws ParseException    *       @    */   public static int getWeekOfDate(String datetime) throws ParseException {     Calendar cal = Calendar.getInstance();     cal.setFirstDayOfWeek(Calendar.MONDAY);     cal.setMinimalDaysInFirstWeek(WEEK_DAYS);     Date date = formatStringToDate(datetime, DATE_FORMAT_YMD);     cal.setTime(date);     return cal.get(Calendar.DAY_OF_WEEK);    }    /**    * 计算某年某周内的所有日期(从周一开始 为每周的第一天)    *    * @param yearNum    * @param weekNum    * @return @    */   public static List<String> getWeekDays(int yearNum, int weekNum) {     return getWeekDays(yearNum, weekNum, Calendar.MONDAY);   }    /**    * 计算某年某周内的所有日期(七天)    *    * @param yearNum    * @param weekNum    * @return yyyy-MM-dd 格式的日期列表    */   public static List<String> getWeekDays(int year, int weekOfYear,       int firstDayOfWeek) {     List<String> dates = new ArrayList<String>();     int dayOfWeek = firstDayOfWeek;     for (int i = 0; i < WEEK_DAYS; i++) {       dates.add(getDateForDayOfWeek(year, weekOfYear, dayOfWeek++,           firstDayOfWeek));     }     return dates;   }    /**    * 获取目标日期的上周、或本周、或下周的年、周信息    *    * @param queryDate    *      传入的时间    * @param weekOffset    *      -1:上周 0:本周 1:下周    * @param firstDayOfWeek    *      每周以第几天为首日    * @return    * @throws ParseException    */   public static int[] getWeekAndYear(String queryDate, int weekOffset,       int firstDayOfWeek) throws ParseException {      Date date = formatStringToDate(queryDate, DATE_FORMAT_YMD);     Calendar calendar = Calendar.getInstance();     calendar.setTime(date);     calendar.setFirstDayOfWeek(firstDayOfWeek);     calendar.setMinimalDaysInFirstWeek(WEEK_DAYS);     int year = calendar.getWeekYear();     int week = calendar.get(Calendar.WEEK_OF_YEAR);     int[] result = { week, year };     switch (weekOffset) {     case 1:       result = getNextYearWeek(year, week);       break;     case -1:       result = getLastYearWeek(year, week);       break;     default:       break;     }     return result;   }    /**    * 计算个两日期的天数    *    * @param startDate    *      开始日期字串    * @param endDate    *      结束日期字串    * @return    * @throws ParseException    */   public static int getDaysBetween(String startDate, String endDate)       throws ParseException {     int dayGap = 0;     if (startDate != null && startDate.length() > 0 && endDate != null         && endDate.length() > 0) {       Date end = formatStringToDate(endDate, DATE_FORMAT_YMD);       Date start = formatStringToDate(startDate, DATE_FORMAT_YMD);       dayGap = getDaysBetween(start, end);     }     return dayGap;   }    private static int getDaysBetween(Date startDate, Date endDate) {     return (int) ((endDate.getTime() - startDate.getTime()) / ONE_DAY_MILLS);   }    /**    * 计算两个日期之间的天数差    * @param startDate    * @param endDate    * @return    */   public static int getDaysGapOfDates(Date startDate, Date endDate) {     int date = 0;     if (startDate != null && endDate != null) {       date = getDaysBetween(startDate, endDate);     }     return date;   }    /**    * 计算两个日期之间的年份差距    *    * @param firstDate    * @param secondDate    * @return    */    public static int getYearGapOfDates(Date firstDate, Date secondDate) {     if (firstDate == null || secondDate == null) {       return 0;     }     Calendar helpCalendar = Calendar.getInstance();     helpCalendar.setTime(firstDate);     int firstYear = helpCalendar.get(Calendar.YEAR);     helpCalendar.setTime(secondDate);     int secondYear = helpCalendar.get(Calendar.YEAR);     return secondYear - firstYear;   }    /**    * 计算两个日期之间的月份差距    *    * @param firstDate    * @param secondDate    * @return    */   public static int getMonthGapOfDates(Date firstDate, Date secondDate) {     if (firstDate == null || secondDate == null) {       return 0;     }      return (int) ((secondDate.getTime() - firstDate.getTime())         / ONE_DAY_MILLS / 30);    }    /**    * 计算是否包含当前日期    *    * @param datys    * @return    */   public static boolean isContainCurrent(List<String> dates) {     boolean flag = false;     SimpleDateFormat fmt = new SimpleDateFormat(DATE_FORMAT_YMD);     Date date = new Date();     String dateStr = fmt.format(date);     for (int i = 0; i < dates.size(); i++) {       if (dateStr.equals(dates.get(i))) {         flag = true;       }     }     return flag;   }    /**    * 从date开始计算time天后的日期    *    * @param date    * @param time    * @return    * @throws ParseException    */   public static String getCalculateDateToString(String startDate, int time)       throws ParseException {     String resultDate = null;     if (startDate != null && startDate.length() > 0) {       Date date = formatStringToDate(startDate, DATE_FORMAT_YMD);       Calendar c = Calendar.getInstance();       c.setTime(date);       c.set(Calendar.DAY_OF_YEAR, time);       date = c.getTime();       resultDate = formatDateToString(date, DATE_FORMAT_YMD);     }     return resultDate;   }    /**    * 获取从某日期开始计算,指定的日期所在该年的第几周    *    * @param date    * @param admitDate    * @return    * @throws ParseException    *       @    */   public static int[] getYearAndWeeks(String date, String admitDate)       throws ParseException {     Calendar c = Calendar.getInstance();     c.setTime(formatStringToDate(admitDate, DATE_FORMAT_YMD));     int time = c.get(Calendar.DAY_OF_WEEK);     return getWeekAndYear(date, 0, time);   }    /**    * 获取指定日期refDate,前或后一周的所有日期    *    * @param refDate    *      参考日期    * @param weekOffset    *      -1:上周 0:本周 1:下周    * @param startDate    *      哪天算一周的第一天    * @return yyyy-MM-dd 格式的日期    * @throws ParseException    *       @    */   public static List<String> getWeekDaysAroundDate(String refDate,       int weekOffset, String startDate) throws ParseException {     // 以startDate为一周的第一天     Calendar c = Calendar.getInstance();     c.setTime(formatStringToDate(startDate, DATE_FORMAT_YMD));     int firstDayOfWeek = c.get(Calendar.DAY_OF_WEEK);     // 获取相应周     int[] weekAndYear = getWeekAndYear(refDate, weekOffset, firstDayOfWeek);     // 获取相应周的所有日期     return getWeekDays(weekAndYear[1], weekAndYear[0], firstDayOfWeek);   }    /**    * 根据时间点获取时间区间    *    * @param hours    * @return    */   public static List<String[]> getTimePointsByHour(int[] hours) {     List<String[]> hourPoints = new ArrayList<String[]>();     String sbStart = ":00:00";     String sbEnd = ":59:59";     for (int i = 0; i < hours.length; i++) {       String[] times = new String[2];       times[0] = hours[i] + sbStart;       times[1] = (hours[(i + 1 + hours.length) % hours.length] - 1)           + sbEnd;       hourPoints.add(times);     }     return hourPoints;   }    /**    *    * 根据指定的日期,增加或者减少天数    *    * @param date    * @param amount    * @return    */   public static Date addDays(Date date, int amount) {     return add(date, Calendar.DAY_OF_MONTH, amount);   }    /**    * 根据指定的日期,类型,增加或减少数量    *    * @param date    * @param calendarField    * @param amount    * @return    */   public static Date add(Date date, int calendarField, int amount) {     if (date == null) {       throw new IllegalArgumentException("The date must not be null");     }     Calendar c = Calendar.getInstance();     c.setTime(date);     c.add(calendarField, amount);     return c.getTime();   }    /**    * 获取当前日期的最大日期 时间2014-12-21 23:59:59    * @return    */   public static Date getCurDateWithMaxTime() {     Calendar c = Calendar.getInstance();     c.set(Calendar.HOUR_OF_DAY, 23);     c.set(Calendar.MINUTE, 59);     c.set(Calendar.SECOND, 59);     return c.getTime();   }    /**    * 获取当前日期的最小日期时间 2014-12-21 00:00:00    * @return    */   public static Date getCurDateWithMinTime() {     Calendar c = Calendar.getInstance();     c.set(Calendar.HOUR_OF_DAY, 0);     c.set(Calendar.MINUTE, 0);     c.set(Calendar.SECOND, 0);     c.set(Calendar.MILLISECOND, 0);     return c.getTime();   }  } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表