java日期和时间操作

Java日期处理

参考

https://juejin.cn/post/6844903560375697422

https://mp.weixin.qq.com/s/q__JSyLt1iy4h3NwZ62VmQ

https://mp.weixin.qq.com/s/V2SRqWfDsxiS67nCnQ3L8A

一、Java 8 日期处理

Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。

Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。

新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。

编号类的名称描述
1 Instant 时间戳
2 Duration 持续时间,时间差
3 LocalDate 只包含日期,比如:2018-02-05
4 LocalTime 只包含时间,比如:23:12:10
5 LocalDateTime 包含日期和时间,比如:2018-02-05 23:14:21
6 Period 时间段
7 ZoneOffset 时区偏移量,比如:+8:00
8 ZonedDateTime 带时区的时间
9 Clock 时钟,比如获取目前美国纽约的时间
10 java.time.format.DateTimeFormatter 时间格式化

示例1:Java 8中获取今天的日期

Java 8 中的 LocalDate 用于表示当天日期。和java.util.Date不同,它只有日期,不包含时间。当你仅需要表示日期时就用这个类。

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo01 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("今天的日期:"+today);
    }
}
/*
    运行结果:
        今天的日期:2018-02-05
*/

示例2:Java 8中获取年、月、日信息

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo02 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        int year = today.getYear();
        int month = today.getMonthValue();
        int day = today.getDayOfMonth();

        System.out.println("year:"+year);
        System.out.println("month:"+month);
        System.out.println("day:"+day);

    }
}

示例3:Java 8中处理特定日期

我们通过静态工厂方法now()非常容易地创建了当天日期,你还可以调用另一个有用的工厂方法LocalDate.of()创建任意日期, 该方法需要传入年、月、日做参数,返回对应的LocalDate实例。这个方法的好处是没再犯老API的设计错误,比如年度起始于1900,月份是从0开 始等等。

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo03 {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2018,2,6);
        System.out.println("自定义日期:"+date);
    }
}

 示例4:Java 8中判断两个日期是否相等

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo04 {
    public static void main(String[] args) {
        LocalDate date1 = LocalDate.now();

        LocalDate date2 = LocalDate.of(2018,2,5);

        if(date1.equals(date2)){
            System.out.println("时间相等");
        }else{
            System.out.println("时间不等");
        }

    }
}

示例5:Java 8中检查像生日这种周期性事件

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.MonthDay;

public class Demo05 {
    public static void main(String[] args) {
        LocalDate date1 = LocalDate.now();

        LocalDate date2 = LocalDate.of(2018,2,6);
        MonthDay birthday = MonthDay.of(date2.getMonth(),date2.getDayOfMonth());
        MonthDay currentMonthDay = MonthDay.from(date1);

        if(currentMonthDay.equals(birthday)){
            System.out.println("是你的生日");
        }else{
            System.out.println("你的生日还没有到");
        }

    }
}

示例6:Java 8中获取当前时间

package com.shxt.demo02;

import java.time.LocalTime;

public class Demo06 {
    public static void main(String[] args) {
        LocalTime time = LocalTime.now();
        System.out.println("获取当前的时间,不含有日期:"+time);

    }
}

可以看到当前时间就只包含时间信息,没有日期

示例7:Java 8中当前时间增加小时

通过增加小时、分、秒来计算将来的时间很常见。Java 8除了不变类型和线程安全的好处之外,还提供了更好的plusHours()方法替换add(),并且是兼容的。注意,这些方法返回一个全新的LocalTime实例,由于其不可变性,返回后一定要用变量赋值。

package com.shxt.demo02;

import java.time.LocalTime;

public class Demo07 {
    public static void main(String[] args) {
        LocalTime time = LocalTime.now();
        LocalTime newTime = time.plusHours(3);
        System.out.println("三个小时后的时间为:"+newTime);

    }
}

示例8:Java 8如何计算一周后的日期

和上个例子计算3小时以后的时间类似,这个例子会计算一周后的日期。LocalDate日期不包含时间信息,它的plus()方法用来增加天、周、月,ChronoUnit类声明了这些时间单位。由于LocalDate也是不变类型,返回后一定要用变量赋值。

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Demo08 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("今天的日期为:"+today);
        LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
        System.out.println("一周后的日期为:"+nextWeek);

    }
}

可以看到新日期离当天日期是7天,也就是一周。你可以用同样的方法增加1个月、1年、1小时、1分钟甚至一个世纪,更多选项可以查看Java 8 API中的ChronoUnit类

示例9:Java 8计算一年前或一年后的日期

利用minus()方法计算一年前的日期

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Demo09 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();

        LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
        System.out.println("一年前的日期 : " + previousYear);

        LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
        System.out.println("一年后的日期:"+nextYear);

    }
}

示例10:Java 8的Clock时钟类

Java 8增加了一个Clock时钟类用于获取当时的时间戳,或当前时区下的日期时间信息。以前用到System.currentTimeInMillis()和TimeZone.getDefault()的地方都可用Clock替换。

 
package com.shxt.demo02;

import java.time.Clock;

public class Demo10 {
    public static void main(String[] args) {
        // Returns the current time based on your system clock and set to UTC.
        Clock clock = Clock.systemUTC();
        System.out.println("Clock : " + clock.millis());

        // Returns time based on system clock zone
        Clock defaultClock = Clock.systemDefaultZone();
        System.out.println("Clock : " + defaultClock.millis());

    }
}

示例11:如何用Java判断日期是早于还是晚于另一个日期

另一个工作中常见的操作就是如何判断给定的一个日期是大于某天还是小于某天?在Java 8中,LocalDate类有两类方法isBefore()和isAfter()用于比较日期。调用isBefore()方法时,如果给定日期小于当前日期则返回true。

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;


public class Demo11 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();

        LocalDate tomorrow = LocalDate.of(2018,2,6);
        if(tomorrow.isAfter(today)){
            System.out.println("之后的日期:"+tomorrow);
        }

        LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
        if(yesterday.isBefore(today)){
            System.out.println("之前的日期:"+yesterday);
        }
    }
}

示例12:Java 8中处理时区

Java 8不仅分离了日期和时间,也把时区分离出来了。现在有一系列单独的类如ZoneId来处理特定时区,ZoneDateTime类来表示某时区下的时间。这在Java 8以前都是 GregorianCalendar类来做的。下面这个例子展示了如何把本时区的时间转换成另一个时区的时间。

package com.shxt.demo02;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Demo12 {
    public static void main(String[] args) {
        // Date and time with timezone in Java 8
        ZoneId america = ZoneId.of("America/New_York");
        LocalDateTime localtDateAndTime = LocalDateTime.now();
        ZonedDateTime dateAndTimeInNewYork  = ZonedDateTime.of(localtDateAndTime, america );
        System.out.println("Current date and time in a particular timezone : " + dateAndTimeInNewYork);
    }
}

示例13:如何表示信用卡到期这类固定日期,答案就在YearMonth

与 MonthDay检查重复事件的例子相似,YearMonth是另一个组合类,用于表示信用卡到期日、FD到期日、期货期权到期日等。还可以用这个类得到 当月共有多少天,YearMonth实例的lengthOfMonth()方法可以返回当月的天数,在判断2月有28天还是29天时非常有用。

package com.shxt.demo02;

import java.time.*;

public class Demo13 {
    public static void main(String[] args) {
        YearMonth currentYearMonth = YearMonth.now();
        System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
        YearMonth creditCardExpiry = YearMonth.of(2019, Month.FEBRUARY);
        System.out.printf("Your credit card expires on %s %n", creditCardExpiry);
    }
}

示例14:如何在Java 8中检查闰年

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo14 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        if(today.isLeapYear()){
            System.out.println("This year is Leap year");
        }else {
            System.out.println("2018 is not a Leap year");
        }

    }
}

示例15:计算两个日期之间的天数和月数

有一个常见日期操作是计算两个日期之间的天数、周数或月数。在Java 8中可以用java.time.Period类来做计算。下面这个例子中,我们计算了当天和将来某一天之间的月数。

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.Period;

public class Demo15 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();

        LocalDate java8Release = LocalDate.of(2018, 12, 14);

        Period periodToNextJavaRelease = Period.between(today, java8Release);
        System.out.println("Months left between today and Java 8 release : "
                + periodToNextJavaRelease.getMonths() );


    }
}

示例16:在Java 8中获取当前的时间戳

Instant类有一个静态工厂方法now()会返回当前的时间戳,如下所示:

package com.shxt.demo02;

import java.time.Instant;

public class Demo16 {
    public static void main(String[] args) {
        Instant timestamp = Instant.now();
        System.out.println("What is value of this instant " + timestamp.toEpochMilli());
    }
}

时间戳信息里同时包含了日期和时间,这和java.util.Date很像。实际上Instant类确实等同于 Java 8之前的Date类,你可以使用Date类和Instant类各自的转换方法互相转换,例如:Date.from(Instant) 将Instant转换成java.util.Date,Date.toInstant()则是将Date类转换成Instant类。

示例17:Java 8中如何使用预定义的格式化工具去解析或格式化日期

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Demo17 {
    public static void main(String[] args) {
        String dayAfterTommorrow = "20180205";
        LocalDate formatted = LocalDate.parse(dayAfterTommorrow,
                DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println(dayAfterTommorrow+"  格式化后的日期为:  "+formatted);
    }
}

示例18:字符串互转日期类型

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Demo18 {
    public static void main(String[] args) {
        LocalDateTime date = LocalDateTime.now();

        DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        //日期转字符串
        String str = date.format(format1);

        System.out.println("日期转换为字符串:"+str);

        DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        //字符串转日期
        LocalDate date2 = LocalDate.parse(str,format2);
        System.out.println("日期类型:"+date2);

    }
}

示例19:对日期做加减运算

LocalDate localDate = LocalDate.now();
System.out.println("2年后日期:" + localDate.plusYears(2));
System.out.println("6月后日期:" + localDate.plusMonths(6));
System.out.println("3周后日期:" + localDate.plusWeeks(3));
System.out.println("15天后日期:" + localDate.plusDays(15));

System.out.println("2年前日期:" + localDate.minusYears(2));
System.out.println("6月前日期:" + localDate.minusMonths(6));
System.out.println("3周前日期:" + localDate.minusWeeks(3));
System.out.println("15天前日期:" + localDate.minusDays(15));

示例20:对时间做加减运算

LocalTime localTime = LocalTime.now();
System.out.println("当前时间:" + localTime);
System.out.println("2小时后时间:" + localTime.plusHours(2));
System.out.println("30分钟后时间:" + localTime.plusMinutes(30));
System.out.println("500秒后日时间:" + localTime.plusSeconds(500));

System.out.println("2小时前时间:" + localTime.minusHours(2));
System.out.println("30分钟前时间:" + localTime.minusMinutes(30));
System.out.println("500秒前时间:" + localTime.minusSeconds(500));

二、Java 8 日期处理

/**
* 日期时间工具类
*
* @author JourWon
* @date 2020/12/5
*/
public class DateUtils {

   /**
    * 显示年月日时分秒,例如 2015-08-11 09:51:53.
    */
   public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

   /**
    * 显示年月日时分,例如 2015-08-11 09:51.
    */
   public static final String NO_SECOND_DATETIME_PATTERN = "yyyy-MM-dd HH:mm";

   /**
    * 仅显示年月日,例如 2015-08-11.
    */
   public static final String DATE_PATTERN = "yyyy-MM-dd";

   /**
    * 仅显示时分秒,例如 09:51:53.
    */
   public static final String TIME_PATTERN = "HH:mm:ss";

   /**
    * 显示年月日时分秒(由/分割),例如 2015/08/11 09:51:53.
    */
   public static final String DATETIME_PATTERN_WITH_SLASH = "yyyy/MM/dd HH:mm:ss";

   /**
    * 显示年月日(由/分割),例如 2015/08/11.
    */
   public static final String DATE_PATTERN_WITH_SLASH = "yyyy/MM/dd";

   /**
    * 显示年月日时分秒(无符号),例如 20150811095153.
    */
   public static final String UNSIGNED_DATETIME_PATTERN = "yyyyMMddHHmmss";

   /**
    * 仅显示年月日(无符号),例如 20150811.
    */
   public static final String UNSIGNED_DATE_PATTERN = "yyyyMMdd";

   /**
    * 仅显示年(无符号),例如 2015.
    */
   private static final String YEAR_PATTERN = "yyyy";

   /**
    * 仅显示年月,例如 2015-08.
    */
   private static final String MONTH_PATTERN = "yyyy-MM";

   /**
    * 仅显示年月(无符号),例如 201508.
    */
   private static final String UNSIGNED_MONTH_PATTERN = "yyyyMM";

   /**
    * 一天的开始时间,仅显示时分秒
    */
   private static final String START_TIME = "00:00:00";

   /**
    * 一天的结束时间,仅显示时分秒
    */
   private static final String END_TIME = "23:59:59";

   /**
    * 每天的毫秒数.
    */
   public static final long MILLISECONDS_PER_DAY = 86400000L;

   /**
    * 每小时毫秒数.
    */
   public static final long MILLISECONDS_PER_HOUR = 3600000L;

   /**
    * 每分钟毫秒数.
    */
   public static final long MILLISECONDS_PER_MINU = 60000L;

   /**
    * 每秒的毫秒数.
    */
   public static final long MILLISECONDS_PER_SECONDS = 1000L;

   /**
    * 每分钟秒数.
    */
   public static final long SECONDS_PER_MINUTE = 60L;

   /**
    * 每小时秒数.
    */
   public static final long SECONDS_PER_HOUR = 3600L;

   /**
    * 每天秒数.
    */
   public static final long SECONDS_PER_DAY = 86400L;

   /**
    * 每周秒数.
    */
   public static final long SECONDS_PER_WEEK = 604800L;

   /**
    * 每个月秒数,默认每月30天.
    */
   public static final long SECONDS_PER_MONTH = 2592000L;

   /**
    * 每年秒数,默认每年365天.
    */
   public static final long SECONDS_PER_YEAR = 31536000L;

   /**
    * 每周的天数.
    */
   public static final long DAYS_PER_WEEK = 7L;

   /**
    * 春天;
    */
   public static final Integer SPRING = 1;

   /**
    * 夏天;
    */
   public static final Integer SUMMER = 2;

   /**
    * 秋天;
    */
   public static final Integer AUTUMN = 3;

   /**
    * 冬天;
    */
   public static final Integer WINTER = 4;

   /**
    * 星期日;
    */
   public static final String SUNDAY = "星期日";

   /**
    * 星期一;
    */
   public static final String MONDAY = "星期一";

   /**
    * 星期二;
    */
   public static final String TUESDAY = "星期二";

   /**
    * 星期三;
    */
   public static final String WEDNESDAY = "星期三";

   /**
    * 星期四;
    */
   public static final String THURSDAY = "星期四";

   /**
    * 星期五;
    */
   public static final String FRIDAY = "星期五";

   /**
    * 星期六;
    */
   public static final String SATURDAY = "星期六";

   /**
    * 获取当前日期和时间字符串.
    *
    * @return String 日期时间字符串,例如 2015-08-11 09:51:53
    */
   public static String getDateTimeStr() {
       return format(new Date(), DATETIME_PATTERN);
  }

   /**
    * 获取当前日期字符串.
    *
    * @return String 日期字符串,例如2015-08-11
    */
   public static String getDateStr() {
       return format(new Date(), DATE_PATTERN);
  }

   /**
    * 获取当前时间字符串.
    *
    * @return String 时间字符串,例如 09:51:53
    */
   public static String getTimeStr() {
       return format(new Date(), TIME_PATTERN);
  }

   /**
    * 获取当前年份字符串.
    *
    * @return String 当前年份字符串,例如 2015
    */
   public static String getYearStr() {
       return format(new Date(), YEAR_PATTERN);
  }

   /**
    * 获取当前月份字符串.
    *
    * @return String 当前月份字符串,例如 08
    */
   public static String getMonthStr() {
       return format(new Date(), "MM");
  }

   /**
    * 获取当前天数字符串.
    *
    * @return String 当前天数字符串,例如 11
    */
   public static String getDayStr() {
       return format(new Date(), "dd");
  }

   /**
    * 获取当前星期字符串.
    *
    * @return String 当前星期字符串,例如 星期二
    */
   public static String getDayOfWeekStr() {
       return format(new Date(), "E");
  }

   /**
    * 获取指定日期是星期几
    *
    * @param date 日期
    * @return String 星期几
    */
   public static String getDayOfWeekStr(Date date) {
       String[] weekOfDays = {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);
       int num = calendar.get(Calendar.DAY_OF_WEEK) - 1;
       return weekOfDays[num];
  }

   /**
    * 获取当前小时字符串.
    *
    * @return String 当前小时字符串,例如09
    */
   public static String getHourStr() {
       return format(new Date(), "HH");
  }

   /**
    * 获取当前分钟字符串.
    *
    * @return String 当前分钟字符串,例如51
    */
   public static String getMinuteStr() {
       return format(new Date(), "mm");
  }

   /**
    * 获取当前秒钟字符串.
    *
    * @return String 当前秒钟字符串,例如53
    */
   public static String getSecondStr() {
       return format(new Date(), "ss");
  }

   /**
    * 获取日期时间字符串
    *
    * @param date   需要转化的日期时间
    * @param pattern 时间格式
    * @return String 日期时间字符串,例如 2015-08-11 09:51:53
    */
   public static String format(Date date, String pattern) {
       return new SimpleDateFormat(pattern).format(date);
  }

   /**
    * 时间戳转换为日期时间字符串
    *
    * @param timestamp 时间戳
    * @param pattern   日期格式 例如DATETIME_PATTERN
    * @return String 日期时间字符串,例如 2015-08-11 09:51:53
    */
   public static String getDateTimeStr(long timestamp, String pattern) {
       return new SimpleDateFormat(pattern).format(timestamp);
  }

   /**
    * 日期字符串转换为日期(java.util.Date)
    *
    * @param dateStr 日期字符串
    * @param pattern 日期格式 例如DATETIME_PATTERN
    * @return Date 日期
    */
   public static Date parse(String dateStr, String pattern) {
       Date date = null;
       SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
       // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
       dateFormat.setLenient(false);
       try {
           date = dateFormat.parse(dateStr);
      } catch (ParseException e) {
           e.printStackTrace();
      }
       return date;
  }

   /**
    * 获取指定日期num年数之后的日期.
    *
    * @param num 间隔年数(负数表示之前)
    * @return Date 日期
    */
   public static Date addYears(Date date, int num) {
       return add(date, num, Calendar.YEAR);
  }

   /**
    * 获取当前日期指定年数之后的日期.
    *
    * @param num 间隔年数(负数表示之前)
    * @return Date 日期
    */
   public static Date addYears(int num) {
       return add(new Date(), num, Calendar.YEAR);
  }

   /**
    * 获取当前日期num月数之后的日期.
    *
    * @param num 间隔月数(负数表示之前)
    * @return Date 日期
    */
   public static Date addMonths(Date date, int num) {
       return add(date, num, Calendar.MONTH);
  }

   /**
    * 获取当前日期指定月数之后的日期.
    *
    * @param num 间隔月数(负数表示之前)
    * @return Date 日期
    */
   public static Date addMonths(int num) {
       return add(new Date(), num, Calendar.MONTH);
  }

   /**
    * 获取指定日期num周数之后的日期.
    *
    * @param date 日期
    * @param num 周数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addWeeks(Date date, int num) {
       return add(date, num, Calendar.WEEK_OF_YEAR);
  }

   /**
    * 获取当前日期指定周数之后的日期.
    *
    * @param num 周数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addWeeks(int num) {
       return add(new Date(), num, Calendar.WEEK_OF_YEAR);
  }

   /**
    * 获取指定日期num天数之后的日期.
    *
    * @param date 日期
    * @param num 天数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addDays(Date date, int num) {
       return add(date, num, Calendar.DAY_OF_MONTH);
  }

   /**
    * 获取当前日期指定天数之后的日期.
    *
    * @param num 天数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addDays(int num) {
       return add(new Date(), num, Calendar.DAY_OF_MONTH);
  }

   /**
    * 获取指定日期num小时之后的日期.
    *
    * @param date 日期
    * @param num 小时数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addHours(Date date, int num) {
       return add(date, num, Calendar.HOUR_OF_DAY);
  }

   /**
    * 获取当前日期指定小时之后的日期.
    *
    * @param num 小时数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addHours(int num) {
       return add(new Date(), num, Calendar.HOUR_OF_DAY);
  }

   /**
    * 获取指定日期num分钟之后的日期.
    *
    * @param date 日期
    * @param num 分钟数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addMinutes(Date date, int num) {
       return add(date, num, Calendar.MINUTE);
  }

   /**
    * 获取当前日期指定分钟之后的日期.
    *
    * @param num 分钟数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addMinutes(int num) {
       return add(new Date(), num, Calendar.MINUTE);
  }

   /**
    * 获取指定日期num秒钟之后的日期.
    *
    * @param date 日期
    * @param num 秒钟数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addSeconds(Date date, int num) {
       return add(date, num, Calendar.SECOND);
  }

   /**
    * 获取当前日期指定秒钟之后的日期.
    *
    * @param num 秒钟数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addSeconds(int num) {
       return add(new Date(), num, Calendar.SECOND);
  }

   /**
    * 获取指定日期num毫秒之后的日期.
    *
    * @param date 日期
    * @param num 毫秒数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addMilliSeconds(Date date, int num) {
       return add(date, num, Calendar.MILLISECOND);
  }

   /**
    * 获取当前日期指定毫秒之后的日期.
    *
    * @param num 毫秒数(负数表示之前)
    * @return Date 新的日期
    */
   public static Date addMilliSeconds(int num) {
       return add(new Date(), num, Calendar.MILLISECOND);
  }

   /**
    * 获取当前日期指定数量日期时间单位之后的日期.
    *
    * @param date 日期
    * @param num 数量
    * @param unit 日期时间单位
    * @return Date 新的日期
    */
   public static Date add(Date date, int num, int unit) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);
       calendar.add(unit, num);
       return calendar.getTime();
  }

   /**
    * 计算两个日期之间相隔年数.
    *
    * @param startDate 开始日期
    * @param endDate   结束日期
    * @return int 相隔年数,向下取整
    */
   public static int getYearsBetween(Date startDate, Date endDate) {
       return getMonthsBetween(startDate, endDate) / 12;
  }

   /**
    * 计算两个日期之间相隔月数.
    *
    * @param startDate 开始日期
    * @param endDate   结束日期
    * @return int 相隔月数,向下取整
    */
   public static int getMonthsBetween(Date startDate, Date endDate) {
       int months;
       int flag = 0;

       Calendar startCalendar = Calendar.getInstance();
       startCalendar.setTime(startDate);
       Calendar endCalendar = Calendar.getInstance();
       endCalendar.setTime(endDate);

       if (endCalendar.equals(startCalendar)) {
           return 0;
      }

       if (startCalendar.after(endCalendar)) {
           Calendar temp = startCalendar;
           startCalendar = endCalendar;
           endCalendar = temp;
      }
       if (endCalendar.get(Calendar.DAY_OF_MONTH) < startCalendar.get(Calendar.DAY_OF_MONTH)) {
           flag = 1;
      }

       if (endCalendar.get(Calendar.YEAR) > startCalendar.get(Calendar.YEAR)) {
           months = ((endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR))
                   * 12 + endCalendar.get(Calendar.MONTH) - flag)
                   - startCalendar.get(Calendar.MONTH);
      } else {
           months = endCalendar.get(Calendar.MONTH)
                   - startCalendar.get(Calendar.MONTH) - flag;
      }

       return months;
  }

   /**
    * 计算两个日期之间相隔周数.
    *
    * @param startDate 开始日期
    * @param endDate   结束日期
    * @return long 相隔周数,向下取整
    */
   public static long getWeeksBetween(Date startDate, Date endDate) {
       return getDaysBetween(startDate, endDate) / DAYS_PER_WEEK;
  }

   /**
    * 计算两个日期之间相隔天数.
    *
    * @param startDate 开始日期
    * @param endDate   结束日期
    * @return long 相隔天数,向下取整
    */
   public static long getDaysBetween(Date startDate, Date endDate) {
       return (endDate.getTime() - startDate.getTime()) / MILLISECONDS_PER_DAY;
  }

   /**
    * 计算两个日期之间相隔小时数.
    *
    * @param startDate 开始日期
    * @param endDate   结束日期
    * @return long 相隔小时数,向下取整
    */
   public static long getHoursBetween(Date startDate, Date endDate) {
       return (endDate.getTime() - startDate.getTime()) / MILLISECONDS_PER_HOUR;
  }

   /**
    * 计算两个日期之间相隔分钟数.
    *
    * @param startDate 开始日期
    * @param endDate   结束日期
    * @return long 相隔分钟数,向下取整
    */
   public static long getMinutesBetween(Date startDate, Date endDate) {
       return (endDate.getTime() - startDate.getTime()) / MILLISECONDS_PER_MINU;
  }

   /**
    * 计算两个日期之间相隔秒数.
    *
    * @param startDate 开始日期
    * @param endDate   结束日期
    * @return long 相隔秒数,向下取整
    */
   public static long getSecondsBetween(Date startDate, Date endDate) {
       return (endDate.getTime() - startDate.getTime()) / MILLISECONDS_PER_SECONDS;
  }

   /**
    * 获取当前季度.
    * 注意:3~5月为春季 1,6~8月为夏季 2,9~11月为秋季 3,12~2月为冬季 4
    *
    * @return int 当前季度数
    */
   public static int getCurrentSeason() {
       Calendar calendar = Calendar.getInstance();
       int month = calendar.get(Calendar.MONTH) + 1;
       int season = 0;
       if (month >= 3 && month <= 5) {
           season = SPRING;
      } else if (month >= 6 && month <= 8) {
           season = SUMMER;
      } else if (month >= 9 && month <= 11) {
           season = AUTUMN;
      } else if (month == 12 || month >= 1 && month <= 2) {
           season = WINTER;
      }
       return season;
  }

   /**
    * 获取当前日期与之前日期的时间间隔.
    *
    * @param date 之前的日期
    * @return String 例如 16分钟前、2小时前、3天前、4月前、5年前等
    */
   public static String getIntervalByDate(Date date) {
       long secondsBetween = getSecondsBetween(date, new Date());
       return getIntervalBySeconds(secondsBetween);
  }

   /**
    * 将以秒为单位的时间转换为其他单位.
    *
    * @param seconds 秒数
    * @return String 例如 16分钟前、2小时前、3天前、4月前、5年前等
    */
   public static String getIntervalBySeconds(long seconds) {
       StringBuffer buffer = new StringBuffer();
       if (seconds < SECONDS_PER_MINUTE) {
           buffer.append(seconds).append("秒前");
      } else if (seconds < SECONDS_PER_HOUR) {
           buffer.append((long) Math.floor(seconds / SECONDS_PER_MINUTE)).append("分钟前");
      } else if (seconds < SECONDS_PER_DAY) {
           buffer.append((long) Math.floor(seconds / SECONDS_PER_HOUR)).append("小时前");
      } else if (seconds < SECONDS_PER_WEEK) {
           buffer.append((long) Math.floor(seconds / SECONDS_PER_DAY)).append("天前");
      } else if (seconds < SECONDS_PER_MONTH) {
           buffer.append((long) Math.floor(seconds / SECONDS_PER_WEEK)).append("周前");
      } else if (seconds < SECONDS_PER_YEAR) {
           buffer.append((long) Math.floor(seconds / SECONDS_PER_MONTH)).append("月前");
      } else {
           buffer.append((long) Math.floor(seconds / SECONDS_PER_YEAR)).append("年前");
      }
       return buffer.toString();
  }

   /**
    * 将 Date 日期转化为 Calendar 类型日期.
    *
    * @param date 指定日期
    * @return Calendar Calendar对象
    */
   public static Calendar getCalendar(Date date) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);
       return calendar;
  }

   /**
    * 得到UTC时间,类型为字符串,格式为"yyyy-MM-dd HH:mm"
    * 如果获取失败,返回null
    *
    * @return
    */
   public static String getUTCTimeStr() {
       StringBuffer UTCTimeBuffer = new StringBuffer();
       // 1、取得本地时间:
       Calendar cal = Calendar.getInstance();
       // 2、取得时间偏移量:
       int zoneOffset = cal.get(Calendar.ZONE_OFFSET);
       // 3、取得夏令时差:
       int dstOffset = cal.get(Calendar.DST_OFFSET);
       // 4、从本地时间里扣除这些差量,即可以取得UTC时间:
       cal.add(Calendar.MILLISECOND, -(zoneOffset + dstOffset));
       int year = cal.get(Calendar.YEAR);
       int month = cal.get(Calendar.MONTH) + 1;
       int day = cal.get(Calendar.DAY_OF_MONTH);
       int hour = cal.get(Calendar.HOUR_OF_DAY);
       int minute = cal.get(Calendar.MINUTE);
       UTCTimeBuffer.append(year).append("-").append(month).append("-").append(day);
       UTCTimeBuffer.append(" ").append(hour).append(":").append(minute);
       try {
           SimpleDateFormat sdf = new SimpleDateFormat(NO_SECOND_DATETIME_PATTERN);
           sdf.parse(UTCTimeBuffer.toString());
           return UTCTimeBuffer.toString();
      } catch (ParseException e) {
           e.printStackTrace();
      }
       return null;
  }

   /**
    * 将Timestamp转换为yyyy-MM-dd HH:mm:ss格式字符串
    *
    * @param timestamp
    * @return
    */
   public static String timestampToStr(Timestamp timestamp) {
       return timestamp.toString().substring(0, 19);
  }

   /**
    * 比较传进来的日期是否大于当前日期,如果传进来的日期大于当前日期则返回true,否则返回false
    *
    * @param dateStr 日期字符串
    * @param pattern 日期格式
    * @return boolean
    */
   public static boolean compareNowDate(String dateStr, String pattern) {
       SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
       try {
           Date date = simpleDateFormat.parse(dateStr);
           return date.after(new Date());
      } catch (ParseException e) {
           e.printStackTrace();
      }
       return false;
  }

   /**
    * 如果endDateStr>startDateStr,返回true,否则返回false
    *
    * @param startDateStr 开始日期字符串
    * @param endDateStr   结束日期字符串
    * @param pattern     日期格式
    * @return boolean
    */
   public static boolean compareDate(String startDateStr, String endDateStr, String pattern) {
       SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
       try {
           Date startDate = simpleDateFormat.parse(startDateStr);
           Date endDate = simpleDateFormat.parse(endDateStr);
           return endDate.after(startDate);
      } catch (ParseException e) {
           e.printStackTrace();
      }
       return false;
  }

   /**
    * 如果startDate>endDate,返回true,否则返回false
    *
    * @param startDate 开始日期字符串
    * @param endDate   结束日期字符串
    * @return boolean
    */
   public static boolean compareDate(Date startDate, Date endDate) {
       return endDate.after(startDate);
  }

   /**
    * 判断日期是否合法
    *
    * @param dateStr yyyy-MM-dd HH:mm:ss格式日期字符串
    * @return
    */
   public static boolean isValidDate(String dateStr) {
       boolean convertSuccess = true;
       // 指定日期格式为四位年/两位月份/两位日期
       SimpleDateFormat format = new SimpleDateFormat(DATETIME_PATTERN);
       try {
           // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
           format.setLenient(false);
           format.parse(dateStr);
      } catch (ParseException e) {
           e.printStackTrace();
           // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
           convertSuccess = false;
      }
       return convertSuccess;
  }

   /**
    * 判断日期是否为月底最后一天
    *
    * @param date 日期
    * @return boolean true:是 false:否
    */
   public static boolean isLastDayofMonth(Date date) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);
       calendar.set(Calendar.DATE, (calendar.get(Calendar.DATE) + 1));
       if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {
           return true;
      }
       return false;
  }

   /**
    * 获取本年第一天的日期字符串
    *
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getYearStartTimeStr() {
       return getDateTimeStr(getStartDayOfYear(new Date()));
  }

   /**
    * 获取指定日期当年第一天的日期字符串
    *
    * @param date
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getYearStartTimeStr(Date date) {
       return getDateTimeStr(getStartDayOfYear(date));
  }

   /**
    * 获取本年最后一天的日期字符串
    *
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getYearEndTimeStr() {
       return getDateTimeStr(getEndDayOfYear(new Date()));
  }

   /**
    * 获取指定日期当年最后一天的日期字符串
    *
    * @param date 指定日期
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getYearEndTimeStr(Date date) {
       return getDateTimeStr(getEndDayOfYear(date));
  }

   /**
    * 获取本月第一天的日期字符串
    * 格式:yyyy-MM-dd HH:mm:ss
    *
    * @return
    */
   public static String getMonthStartTimeStr() {
       return getDateTimeStr(getStartDayOfMonth(new Date()));
  }

   /**
    * 获取指定日期当月第一天的日期字符串
    *
    * @param date 指定日期
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getMonthStartTimeStr(Date date) {
       return getDateTimeStr(getStartDayOfMonth(date));
  }

   /**
    * 获取本月最后一天的日期字符串
    *
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getMonthEndTimeStr() {
       return getDateTimeStr(getEndDayOfMonth(new Date()));
  }

   /**
    * 获取指定日期当月最后一天的日期字符串
    *
    * @param date 指定日期
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getMonthEndTimeStr(Date date) {
       return getDateTimeStr(getEndDayOfMonth(date));
  }

   /**
    * 获取本周第一天的日期字符串
    *
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getWeekStartTimeStr() {
       return getDateTimeStr(getStartDayOfWeek(new Date()));
  }

   /**
    * 获取指定日期当周第一天的日期字符串
    *
    * @param date 指定日期
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getWeekStartTimeStr(Date date) {
       return getDateTimeStr(getStartDayOfWeek(date));
  }

   /**
    * 获取本周最后一天的日期字符串
    *
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getWeekEndTimeStr() {
       return getDateTimeStr(getEndDayOfWeek(new Date()));
  }

   /**
    * 获取指定日期当周最后一天的日期字符串
    *
    * @param date 指定日期
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getWeekEndTimeStr(Date date) {
       return getDateTimeStr(getEndDayOfWeek(date));
  }

   /**
    * 获取今天的开始时间字符串
    *
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getTodayStartTimeStr() {
       return getDateTimeStr(getTodayStartTime(new Date()));
  }

   /**
    * 获取指定日期的开始时间字符串
    *
    * @param date 指定日期
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getTodayStartTimeStr(Date date) {
       return getDateTimeStr(getTodayStartTime(date));
  }

   /**
    * 获取今天的结束时间字符串
    *
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getTodayEndTimeStr() {
       return getDateTimeStr(getTodayEndTime(new Date()));
  }

   /**
    * 获取指定日期的结束时间字符串
    *
    * @param date 指定日期
    * @return String 格式:yyyy-MM-dd HH:mm:ss
    */
   public static String getTodayEndTimeStr(Date date) {
       return getDateTimeStr(getTodayEndTime(date));
  }

   /**
    * 获得指定日期所在日的开始时间字符串
    *
    * @param date 指定日期
    * @return String 例如:2020-12-06 00:00:00
    */
   public static String getDateStartTimeStr(Date date) {
       String result = format(date, DATE_PATTERN);
       return result.concat(" ").concat(START_TIME);
  }

   /**
    * 获得指定日期所在日的结束时间字符串
    *
    * @param date 指定日期
    * @return String 例如:2020-12-06 23:59:59
    */
   public static String getDateEndTimeStr(Date date) {
       String result = format(date, DATE_PATTERN);
       return result.concat(" ").concat(END_TIME);
  }

   /**
    * 根据日历返回日期时间字符串
    *
    * @param calendar 日历
    * @return String 日期时间字符串
    */
   public static String getDateTimeStr(Calendar calendar) {
       StringBuffer buf = new StringBuffer("");

       buf.append(calendar.get(Calendar.YEAR));
       buf.append("-");
       buf.append(calendar.get(Calendar.MONTH) + 1 > 9 ? calendar.get(Calendar.MONTH) + 1 + ""
              : "0" + (calendar.get(Calendar.MONTH) + 1));
       buf.append("-");
       buf.append(calendar.get(Calendar.DAY_OF_MONTH) > 9 ? calendar.get(Calendar.DAY_OF_MONTH) + ""
              : "0" + calendar.get(Calendar.DAY_OF_MONTH));
       buf.append(" ");
       buf.append(calendar.get(Calendar.HOUR_OF_DAY) > 9 ? calendar.get(Calendar.HOUR_OF_DAY) + ""
              : "0" + calendar.get(Calendar.HOUR_OF_DAY));
       buf.append(":");
       buf.append(calendar.get(Calendar.MINUTE) > 9 ? calendar.get(Calendar.MINUTE) + ""
              : "0" + calendar.get(Calendar.MINUTE));
       buf.append(":");
       buf.append(calendar.get(Calendar.SECOND) > 9 ? calendar.get(Calendar.SECOND) + ""
              : "0" + calendar.get(Calendar.SECOND));
       return buf.toString();
  }

   /**
    * 获取今年的第一天
    *
    * @return Calendar 日历
    */
   public static Calendar getStartDayOfYear(Date date) {
       Calendar calendar = Calendar.getInstance(Locale.CHINA);
       calendar.setTime(date);
       calendar.set(Calendar.DAY_OF_YEAR, 1);
       calendar.set(Calendar.HOUR_OF_DAY, 0);
       calendar.set(Calendar.MINUTE, 0);
       calendar.set(Calendar.SECOND, 0);
       return calendar;
  }

   /**
    * 获取今年的最后一天
    *
    * @return Calendar 日历
    */
   public static Calendar getEndDayOfYear(Date date) {
       Calendar calendar = Calendar.getInstance(Locale.CHINA);
       calendar.setTime(date);
       int i = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
       calendar.set(Calendar.DAY_OF_YEAR, i);
       calendar.set(Calendar.HOUR_OF_DAY, 23);
       calendar.set(Calendar.MINUTE, 59);
       calendar.set(Calendar.SECOND, 59);
       return calendar;
  }

   /**
    * 获取本月的第一天
    *
    * @return Calendar 日历
    */
   public static Calendar getStartDayOfMonth(Date date) {
       Calendar calendar = Calendar.getInstance(Locale.CHINA);
       calendar.setTime(date);
       calendar.set(Calendar.DAY_OF_MONTH, 1);
       calendar.set(Calendar.HOUR_OF_DAY, 0);
       calendar.set(Calendar.MINUTE, 0);
       calendar.set(Calendar.SECOND, 0);
       return calendar;
  }

   /**
    * 获取本月的最后一天
    *
    * @return Calendar 日历
    */
   public static Calendar getEndDayOfMonth(Date date) {
       Calendar calendar = Calendar.getInstance(Locale.CHINA);
       calendar.setTime(date);
       int i = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
       calendar.set(Calendar.DAY_OF_MONTH, i);
       calendar.set(Calendar.HOUR_OF_DAY, 23);
       calendar.set(Calendar.MINUTE, 59);
       calendar.set(Calendar.SECOND, 59);
       return calendar;
  }

   /**
    * 获取本周的第一天,一个星期的第一天是星期一,最后一天是星期天
    *
    * @return Calendar 日历
    */
   public static Calendar getStartDayOfWeek(Date date) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);
       // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
       calendar.setFirstDayOfWeek(Calendar.MONDAY);
       calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

       calendar.set(Calendar.HOUR_OF_DAY, 0);
       calendar.set(Calendar.MINUTE, 0);
       calendar.set(Calendar.SECOND, 0);
       return calendar;
  }

   /**
    * 获取本周的最后一天,一个星期的第一天是星期一,最后一天是星期天
    *
    * @return Calendar 日历
    */
   public static Calendar getEndDayOfWeek(Date date) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);
       // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
       calendar.setFirstDayOfWeek(Calendar.MONDAY);
       calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);

       calendar.set(Calendar.HOUR_OF_DAY, 23);
       calendar.set(Calendar.MINUTE, 59);
       calendar.set(Calendar.SECOND, 59);
       return calendar;
  }

   /**
    * 获取今天开始时间
    *
    * @return
    */
   public static Calendar getTodayStartTime(Date date) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);
       calendar.set(Calendar.HOUR_OF_DAY, 0);
       calendar.set(Calendar.MINUTE, 0);
       calendar.set(Calendar.SECOND, 0);
       calendar.set(Calendar.MILLISECOND, 0);
       return calendar;
  }

   /**
    * 获取今天结束时间
    *
    * @return
    */
   public static Calendar getTodayEndTime(Date date) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);
       calendar.set(Calendar.HOUR_OF_DAY, 23);
       calendar.set(Calendar.MINUTE, 59);
       calendar.set(Calendar.SECOND, 59);
       calendar.set(Calendar.MILLISECOND, 999);
       return calendar;
  }

   /**
    * 根据日期范围,获取按周期划分的日期区间
    *
    * @param startDateStr 开始日期(格式:2020-11-29)
    * @param endDateStr   结束日期(格式:2020-12-02)
    * @param pattern     日期格式(支持:DATE_PATTERN,MONTH_PATTERN,YEAR_PATTERN)
    * @return List<String> 区间集合 例如:[2020-11-29,2020-11-30,2020-12-01,2020-12-02]
    */
   public static List<String> getDateStrList(String startDateStr, String endDateStr, String pattern) {
       Date start = parse(startDateStr, pattern);
       Date end = parse(endDateStr, pattern);
       return getDateStrList(start, end, pattern);
  }

   /**
    * 根据日期范围,获取按周期划分的日期区间
    *
    * @param startDate 开始日期
    * @param endDate   结束日期
    * @param pattern   日期格式(支持:DATE_PATTERN,MONTH_PATTERN,YEAR_PATTERN)
    * @return List<String> 区间集合 例如:[2020-11-29,2020-11-30,2020-12-01,2020-12-02]
    */
   public static List<String> getDateStrList(Date startDate, Date endDate, String pattern) {
       List<String> result = new ArrayList<>();

       Calendar calendar = Calendar.getInstance();
       calendar.setTime(startDate);
       if (DATE_PATTERN.equals(pattern)) {
           while (startDate.before(endDate) || startDate.equals(endDate)) {
               result.add(new SimpleDateFormat(DATE_PATTERN).format(calendar.getTimeInMillis()));
               calendar.add(Calendar.DATE, 1);
               startDate = calendar.getTime();
          }
      } else if (MONTH_PATTERN.equals(pattern)) {
           while (startDate.before(endDate) || startDate.equals(endDate)) {
               result.add(new SimpleDateFormat(MONTH_PATTERN).format(calendar.getTimeInMillis()));
               calendar.add(Calendar.MONTH, 1);
               startDate = calendar.getTime();
          }
      } else if (YEAR_PATTERN.equals(pattern)) {
           while (startDate.before(endDate) || startDate.equals(endDate)) {
               result.add(new SimpleDateFormat(YEAR_PATTERN).format(calendar.getTimeInMillis()));
               calendar.add(Calendar.YEAR, 1);
               startDate = calendar.getTime();
          }
      }
       return result;
  }

   /**
    * 获取当前日期前后num天的集合
    *
    * @param num 天数(正数:之后;负数:之前)
    * @return List<String> 前/后日期的集合(包含指定日期)
    */
   public static List<String> getDateStrList(int num) {
       return getDateStrList(new Date(), num, DATE_PATTERN);
  }

   /**
    * 获取指定日期前后num天的集合
    *
    * @param date 指定日期
    * @param num 天数(正数:之后;负数:之前)
    * @return List<String> 前/后日期的集合(包含指定日期)
    */
   public static List<String> getDateStrList(Date date, int num) {
       return getDateStrList(date, num, DATE_PATTERN);
  }

   /**
    * 获取指定日期前后num天的集合,带日期格式参数
    *
    * @param date   指定日期
    * @param num     天数(正数:之后;负数:之前)
    * @param pattern 日期格式
    * @return List<String> 前/后日期的集合(包含指定日期) 例如:[2020-11-29,2020-11-30,2020-12-01]
    */
   public static List<String> getDateStrList(Date date, int num, String pattern) {
       List<String> result = new ArrayList<>();
       Calendar c = Calendar.getInstance();
       c.setTime(date);
       boolean flag = false;
       if (num < 0) {
           num = Math.abs(num);
           flag = true;
      }
       for (int i = 0; i < num; i++) {
           result.add(new SimpleDateFormat(pattern).format(c.getTimeInMillis()));
           c.add(Calendar.DATE, flag ? -1 : 1);
      }
       if (flag) {
           Collections.reverse(result);
      }
       return result;
  }

   public static void main(String[] args) {
       System.out.println("=======================");
       System.out.println(getYearStr());
       System.out.println(getMonthStr());
       System.out.println(getDayStr());
       System.out.println(getHourStr());
       System.out.println(getMinuteStr());
       System.out.println(getSecondStr());

       System.out.println(getDateTimeStr());
       System.out.println(getDateStr());
       System.out.println(getTimeStr());
       System.out.println(getDayOfWeekStr());
       System.out.println(getDayOfWeekStr(parse("2020-12-05", DATE_PATTERN)));
       System.out.println(getDateTimeStr(System.currentTimeMillis(), DATETIME_PATTERN));

       System.out.println("=======================");
       System.out.println(parse("2020-12-31", DATE_PATTERN));

       System.out.println("=======================");
       System.out.println(addYears(1));
       System.out.println(addYears(new Date(), -1));
       System.out.println(addMonths(1));
       System.out.println(addMonths(new Date(), -1));
       System.out.println(addWeeks(1));
       System.out.println(addWeeks(new Date(), -1));
       System.out.println(addDays(1));
       System.out.println(addDays(new Date(), -1));
       System.out.println(addHours(1));
       System.out.println(addHours(new Date(), -1));
       System.out.println(addMinutes(1));
       System.out.println(addMinutes(new Date(), -1));
       System.out.println(addSeconds(1));
       System.out.println(addSeconds(new Date(), -1));
       System.out.println(addMilliSeconds(1));
       System.out.println(addMilliSeconds(new Date(), -1));

       System.out.println("=======================");
       System.out.println(getYearsBetween(parse("2020-01-30", DATE_PATTERN), parse("2021-01-29", DATE_PATTERN)));
       System.out.println(getMonthsBetween(parse("2020-01-30", DATE_PATTERN), parse("2021-01-29", DATE_PATTERN)));
       System.out.println(getWeeksBetween(parse("2020-01-30", DATE_PATTERN), parse("2020-02-06", DATE_PATTERN)));
       System.out.println(getDaysBetween(parse("2020-01-30", DATE_PATTERN), parse("2020-02-06", DATE_PATTERN)));
       System.out.println(getHoursBetween(parse("2020-01-30", DATE_PATTERN), parse("2020-02-06", DATE_PATTERN)));
       System.out.println(getMinutesBetween(parse("2020-01-30", DATE_PATTERN), parse("2020-02-06", DATE_PATTERN)));
       System.out.println(getSecondsBetween(parse("2020-12-06 19:47:00", DATETIME_PATTERN), parse("2020-12-06 19:47:50", DATETIME_PATTERN)));

       System.out.println("=======================");
       System.out.println(getCurrentSeason());

       System.out.println("=======================");
       System.out.println(getIntervalByDate(parse("2020-12-06 19:30:00", DATETIME_PATTERN)));
       System.out.println(getIntervalBySeconds(604800L));

       System.out.println("=======================");
       System.out.println(getCalendar(new Date()));
       System.out.println(getUTCTimeStr());

       System.out.println("=======================");
       System.out.println(timestampToStr(new Timestamp(System.currentTimeMillis())));

       System.out.println("=======================");
       System.out.println(compareNowDate("2020-12-07", DATE_PATTERN));
       System.out.println(compareDate(parse("2020-12-05", DATE_PATTERN), new Date()));
       System.out.println(compareDate("2020-12-05", "2020-12-06", DATE_PATTERN));

       System.out.println("=======================");
       System.out.println(isValidDate("2020-02-29 23:59:00"));
       System.out.println(isLastDayofMonth(parse("2020-11-01 00:00:00", DATETIME_PATTERN)));

       System.out.println("=======================");
       System.out.println(getYearStartTimeStr());
       System.out.println(getYearStartTimeStr(parse("2019-12-06", DATE_PATTERN)));
       System.out.println(getYearEndTimeStr());
       System.out.println(getYearEndTimeStr(parse("2019-12-06", DATE_PATTERN)));
       System.out.println(getMonthStartTimeStr());
       System.out.println(getMonthStartTimeStr(parse("2019-12-06", DATE_PATTERN)));
       System.out.println(getMonthEndTimeStr());
       System.out.println(getMonthEndTimeStr(parse("2019-12-06", DATE_PATTERN)));
       System.out.println(getWeekStartTimeStr());
       System.out.println(getWeekStartTimeStr(parse("2019-12-06", DATE_PATTERN)));
       System.out.println(getWeekEndTimeStr());
       System.out.println(getWeekEndTimeStr(parse("2019-12-06", DATE_PATTERN)));
       System.out.println(getTodayStartTimeStr());
       System.out.println(getTodayStartTimeStr(parse("2019-12-06", DATE_PATTERN)));
       System.out.println(getTodayEndTimeStr());
       System.out.println(getTodayEndTimeStr(parse("2019-12-06", DATE_PATTERN)));
       System.out.println(getDateStartTimeStr(parse("2020-11-01 00:00:00", DATETIME_PATTERN)));
       System.out.println(getDateEndTimeStr(parse("2020-11-01 00:00:00", DATETIME_PATTERN)));

       System.out.println("=======================");
       List<String> strList1 = getDateStrList(3);
       for (String s : strList1) {
           System.out.println(s);
      }

       System.out.println("=======================");
       List<String> dayList = getDateStrList(parse("2020-11-29", DATE_PATTERN), 3);
       for (String s : dayList) {
           System.out.println(s);
      }

       System.out.println("=======================");
       List<String> dateList = getDateStrList("2020-11-29", "2020-12-06", DATE_PATTERN);
       for (String s : dateList) {
           System.out.println(s);
      }

       System.out.println("=======================");
       List<String> strList = getDateStrList(parse("2020-11-29", DATE_PATTERN), parse("2020-12-06", DATE_PATTERN), DATE_PATTERN);
       for (String s : strList) {
           System.out.println(s);
      }
  }

}
原文地址:https://www.cnblogs.com/konglxblog/p/15171095.html