zoukankan      html  css  js  c++  java
  • 日期处理工具类

    import java.text.ParseException;
    import java.text.ParsePosition;
    import java.text.SimpleDateFormat;
    import java.util.*;
    
    /**
     * 类名:DateUtil  <br />
     * <p>
     * 功能:
    
     * 创建时间:2015年12月4日 下午4:44:11  <br />
     * @version 2015年12月4日
     */
    public class DateUtil {
    
        // 缓存
        private static final Map<String, SimpleDateFormat> formats;
    
        static {
            formats = new HashMap<String, SimpleDateFormat>();
    
            formats.put("yyyyMMdd", new SimpleDateFormat("yyyyMMdd"));
            formats.put("HHmmss", new SimpleDateFormat("HHmmss"));
            formats.put("yyyyMMddHHmmss", new SimpleDateFormat("yyyyMMddHHmmss"));
            formats.put("yyyyMMddHHmmssSSS", new SimpleDateFormat("yyyyMMddHHmmssSSS"));
        }
    
        /**
         * 功能:比较两个日期的顺序 <br/>
         *
    
         * @version 2013-12-28 上午11:20:58 <br/>
         */
        public static int compare(Date one, Date two) {
            return one.compareTo(two);
        }
    
        /**
         * 功能: <br/>
         *
         * @version 2013-12-4 下午02:06:59 <br/>
         */
        public static Date addDays(Date date, int field) {
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            c.add(Calendar.DAY_OF_MONTH, field);
            return c.getTime();
        }
    
        /**
         * 功能: <br/>
         *
         * @version 2013-12-4 下午02:06:59 <br/>
         */
        public static Date addHours(Date date, int field) {
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            c.add(Calendar.HOUR, field);
            return c.getTime();
        }
    
        /**
         * 功能: <br/>
         * @version 2013-12-4 下午02:06:59 <br/>
         */
        public static Date add(Date date, int field, int amount) {
            return add(date, field, amount, null);
        }
    
        /**
         * 功能: <br/>
         * field like Calendar.SECOND
         *
    
         * @version 2013-12-4 下午02:06:19 <br/>
         */
        public static Date add(Date date, int field, int amount, TimeZone timeZone) {
            Calendar cal = (timeZone == null ? Calendar.getInstance() : Calendar.getInstance(timeZone));
    
            cal.setTime(date);
    
            cal.add(field, amount);
    
            return cal.getTime();
        }
    
        /**
         * 功能: <br/>
         * @version 2013-11-27 上午10:01:13 <br/>
         */
        public static Date parseDateTime(String source) throws ParseException {
            return parse(source, "yyyyMMddHHmmss");
        }
    
        /**
         * 功能: <br/>
         *
         * @version 2013-11-27 上午10:01:28 <br/>
         */
        public static Date parseTime(String source) throws ParseException {
            return parse(source, "HHmmss");
        }
    
        /**
         * 功能: <br/>
         *
         * @throws ParseException
         * @version 2013-11-27 上午10:00:50 <br/>
         */
        public static Date parseDate(String source) throws ParseException {
            return parse(source, "yyyyMMdd");
        }
    
        /**
         * 功能: <br/>
         *
         * @version 2013-11-27 上午10:00:17 <br/>
         */
        public static Date parse(String source, String pattern) throws ParseException {
            return getFormat(pattern).parse(source);
        }
    
        /**
         * 功能:获取获取毫秒值得时间戳 + 0-9 随机数一位 <br/>
         *
         * @version 2013-11-26 下午07:58:17 <br/>
         */
        public static String getRandomCurrentTimeStamp() {
            return formaCurrentTimeStamp(new Date()) + new Random().nextInt(9);
        }
    
        /**
         * 功能:获取秒值得时间戳 <br/>
         *
         * @version 2013-11-26 下午07:58:17 <br/>
         */
        public static String getTimeStamp() {
            return formatDateTime(new Date());
        }
    
        /**
         * 功能: 获取毫秒值得时间戳 <br/>
         *
         * @version 2013-11-26 下午07:58:17 <br/>
         */
        public static String getCurrentTimeStamp() {
            return formaCurrentTimeStamp(new Date());
        }
    
        /**
         * 功能: <br/>
         * @version 2013-11-26 下午07:58:17 <br/>
         */
        public static String formaCurrentTimeStamp(Date date) {
            return format(date, "yyyyMMddHHmmssSSS");
        }
    
        /**
         * 功能: <br/>
         *
         * @version 2013-11-26 下午07:58:17 <br/>
         */
        public static String formatDateTime(Date date) {
            return format(date, "yyyyMMddHHmmss");
        }
    
        /**
         * 功能:按默认规则格式化为时间
         * @version 2013-11-26 下午07:57:33 <br/>
         */
        public static String formatTime(Date date) {
            return format(date, "HHmmss");
        }
    
        /**
         * 功能:按默认规则格式化日期 <br/>
         *
         * @version 2013-11-26 下午07:56:47 <br/>
         */
        public static String formatDate(Date date) {
            return format(date, "yyyyMMdd");
        }
    
        /**
         * 功能: <br/>
         *
         * @version 2013-11-26 下午07:55:49 <br/>
         */
        public static String format(Date date, String pattern) {
            return getFormat(pattern).format(date);
        }
    
        /**
         * 功能: <br/>
         *
         * @version 2013-11-27 上午09:59:37 <br/>
         */
        private static SimpleDateFormat getFormat(String pattern) {
            SimpleDateFormat sdf = formats.get(pattern);
    
            if (null == sdf) {
                formats.put(pattern, sdf = new SimpleDateFormat(pattern));
            }
    
            // 强制格式匹配
            sdf.setLenient(false);
    
            return sdf;
        }
    
        /**
         * 将短时间格式时间转换为字符串 yyyy-MM-dd
         *
         * @param dateDate
         * @return
         */
        public static String dateToStr(Date dateDate) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            String dateString = formatter.format(dateDate);
            return dateString;
        }
    
        /**
         * 将短时间格式字符串转换为时间 yyyy-MM-dd
         *
         * @param strDate
         * @return
         */
        public static Date strToDate(String strDate) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            ParsePosition pos = new ParsePosition(0);
            Date strtodate = formatter.parse(strDate, pos);
            return strtodate;
        }
    
        //判断某个时间是否在当前时间的7天之内
        public static Boolean isLatestWeek(Date addtime, Date now) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(now);
            calendar.add(Calendar.DAY_OF_MONTH, -7);
            Date before7days = calendar.getTime();
            if (before7days.getTime() < addtime.getTime()) {
                return true;
            } else {
                return false;
            }
        }
    
        /**
         * 返回指定年度的所有周。List中包含的是String[2]对象<br>
         * string[0]本周的开始日期,string[1]是本周的结束日期。<br>
         * 日期的格式为yyyy-MM-dd。<br>
         * 每年的第一个周,必须包含星期一且是完整的七天。<br>
         * 例如:2009年的第一个周开始日期为2009-01-05,结束日期为2009-01-11。 <br>
         * 星期一在哪一年,那么包含这个星期的周就是哪一年的周。<br>
         * 例如:2008-12-29是星期一,2009-01-04是星期日,哪么这个周就是2008年度的最后一个周。<br>
         *
         * @param year 格式 yyyy ,必须大于1900年度 小于9999年
         * @return
         */
        public static List<Date[]> getWeeksByYear(final int year) {
            if (year < 1900 || year > 9999) {
                throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
            }
            //实现思路,首先计算当年有多少个周,然后找到每个周的开始日期和结束日期
            // Calendar calendar = new GregorianCalendar();
            // // 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。
            // calendar.setFirstDayOfWeek(Calendar.MONDAY); //设置每周的第一天为星期一
            // calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); //每周从周一开始
            // 上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。
            // calendar.setMinimalDaysInFirstWeek(7); //设置每周最少为7天
            // calendar.set(Calendar.YEAR, year); // 设置年度为指定的年
            // //首先计算当年有多少个周,每年都至少有52个周,个别年度有53个周
            int weeks = getWeekNumByYear(year);
            // System.out.println(year+"共有"+weeks+"个周");
            List<Date[]> result = new ArrayList<Date[]>(weeks);
            for (int i = 1; i <= weeks; i++) {
                Date[] tempWeek = new Date[2];
                tempWeek[0] = getYearWeekFirstDay(year, i);
                tempWeek[1] = getYearWeekEndDay(year, i);
                //或者使用下面的代码,不过发现效率更低
                // tempWeek[0] = getDateAdd(firstWeekDay,(i-1)*7+0);
                // tempWeek[1] = getDateAdd(firstWeekDay,(i-1)*7+6);
                result.add(tempWeek);
                // System.out.println(i+"="+tempWeek[0]+"_"+tempWeek[1]);
            }
            return result;
        }
    
    
        /**
         * 计算指定年度共有多少个周。
         *
         * @param year 格式 yyyy ,必须大于1900年度 小于9999年
         * @return
         */
        public static int getWeekNumByYear(final int year) {
            if (year < 1900 || year > 9999) {
                throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
            }
            int result = 52;//每年至少有52个周 ,最多有53个周。
            String date = format(getYearWeekFirstDay(year, 53), "yyyy-MM-dd");
    
            if (date.substring(0, 4).equals(year + "")) { //判断年度是否相符,如果相符说明有53个周。
                result = 53;
            }
            return result;
        }
    
        /**
         * 计算某年某周的开始日期
         *
         * @param yearNum 格式 yyyy ,必须大于1900年度 小于9999年
         * @param weekNum 1到52或者53
         * @return 日期,格式为yyyy-MM-dd
         */
        public static Date getYearWeekFirstDay(int yearNum, int weekNum) {
            if (yearNum < 1900 || yearNum > 9999) {
                throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
            }
            Calendar cal = Calendar.getInstance();
            cal.setFirstDayOfWeek(Calendar.MONDAY); //设置每周的第一天为星期一
            cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//每周从周一开始
            // 上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。
            cal.setMinimalDaysInFirstWeek(7); //设置每周最少为7天
            cal.set(Calendar.YEAR, yearNum);
            cal.set(Calendar.WEEK_OF_YEAR, weekNum);
    
            //分别取得当前日期的年、月、日
            return cal.getTime();
        }
    
        /**
         * 计算某年某周的结束日期
         *
         * @param yearNum 格式 yyyy ,必须大于1900年度 小于9999年
         * @param weekNum 1到52或者53
         * @return 日期,格式为yyyy-MM-dd
         */
        public static Date getYearWeekEndDay(int yearNum, int weekNum) {
            if (yearNum < 1900 || yearNum > 9999) {
                throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
            }
            Calendar cal = Calendar.getInstance();
            cal.setFirstDayOfWeek(Calendar.MONDAY); //设置每周的第一天为星期一
            cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//每周从周一开始
            // 上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。
            cal.setMinimalDaysInFirstWeek(7); //设置每周最少为7天
            cal.set(Calendar.YEAR, yearNum);
            cal.set(Calendar.WEEK_OF_YEAR, weekNum);
    
            return cal.getTime();
        }
    
        public static int getWeekNumInYear(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setFirstDayOfWeek(Calendar.MONDAY);
            calendar.setTime(date);
            return calendar.get(Calendar.WEEK_OF_YEAR);
        }
    
        /**
         * 获取当前日期
         *
         * @return
         */
        public static Date getCurrentDate() {
            Date today = new Date();
            return today;
        }
    
        /**
         * 根据每周的开始结束日期计算每天日期
         *
         * @param startDate
         * @param endDate
         * @return
         * @throws ParseException
         */
        public static Map<String, Date> getBetweenWeeks(Date startDate, Date endDate) {
    
            Calendar tempStart = Calendar.getInstance();
            tempStart.setTime(startDate);
            Calendar tempEnd = Calendar.getInstance();
            tempEnd.setTime(endDate);
            Map<String, Date> map = new LinkedHashMap<>();
            while (tempStart.before(tempEnd) || tempStart.equals(tempEnd)) {
                int week = tempStart.get(Calendar.DAY_OF_WEEK);
                switch (week) {
                    case 1:
                        map.put("sun", tempStart.getTime());
                        break;
                    case 2:
                        map.put("mon", tempStart.getTime());
                        break;
                    case 3:
                        map.put("tue", tempStart.getTime());
                        break;
                    case 4:
                        map.put("wed", tempStart.getTime());
                        break;
                    case 5:
                        map.put("thur", tempStart.getTime());
                        break;
                    case 6:
                        map.put("fri", tempStart.getTime());
                        break;
                    case 7:
                        map.put("sat", tempStart.getTime());
                        break;
                }
    
                tempStart.add(Calendar.DAY_OF_YEAR, 1);
            }
            return map;
        }
    
    
        public static int interval(Date a, Date b) {
            return (int) ((b.getTime() - a.getTime())/1000);
        }
    }
  • 相关阅读:
    LUA 数据比较BUG?????是不是BUG大佬帮看看
    win10 优化批处理
    android Studio 二维码扫一扫 使用精简过的zxing
    AppCompatActivity 去除标题栏
    java 继承 重写 重载 super关键字
    java构造方法私有化
    java代码块的理解
    java 理解main方法
    java面向对象基础static
    docker 安装 nginx
  • 原文地址:https://www.cnblogs.com/lc0605/p/11356157.html
Copyright © 2011-2022 走看看