一、旧的日期时间API
1、Date 类提供的常用方法有:
getTime():(自1970年1月1日经历的毫秒数值)获取两个日期,然后比较。
before():若当调用此方法的Date对象在指定日期之前返回true,否则返回false。
after():若当调用此方法的Date对象在指定日期之后返回true,否则返回false。
equals():当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。
compareTo():比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数
    
2、Calendar类提供的常用方法有:
get():返回给定日历字段的值。
set():将给定的日历字段设置为给定值。
add():根据日历的规则,为给定的日历字段添加或减去指定的时间量。
getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。

二、Java 8日期时间API中主要涉及到以下类和接口:
1、java.time.LocalDate:表示一个ISO-8601格式的日期,不包含时间信息,LocalDate 类提供了很多方法来操作日期对象,以下是一些常用的方法:
getYear():获取当前日期的年份。
getMonth():获取当前日期的月份。
getDayOfMonth():获取当前日期的日子。
plusDays(long daysToAdd):增加指定天数后的日期对象。
minusDays(long daysToSubtract):减去指定天数后的日期对象。
isLeapYear():判断当前年份是否是闰年。

2、java.time.LocalTime:表示一个ISO-8601格式的时间,不包含日期信息,LocalTime 类提供了很多方法来操作时间对象,以下是一些常用的方法:
getHour():获取当前时间的小时数。
getMinute():获取当前时间的分钟数。
getSecond():获取当前时间的秒数。
plusHours(long hoursToAdd):增加指定小时数后的时间对象。
minusMinutes(long minutesToSubtract):减去指定分钟数后的时间对象。


3、java.time.LocalDateTime:表示一个ISO-8601格式的日期时间,LocalDateTime 类提供了很多方法来操作日期和时间对象,以下是一些常用的方法:
toLocalDate():将当前日期时间转换为日期对象。
toLocalTime():将当前日期时间转换为时间对象。
plusDays(long daysToAdd):增加指定天数后的日期时间对象。
minusMonths(long monthsToSubtract):减去指定月份数后的日期时间对象。


4、java.time.Instant:表示从‘1970-01-01T00:00:00Z’开始的秒数,Instant 类提供了很多方法来操作日期时间对象,以下是一些常用的方法:
getEpochSecond():获取当前 Instant 对象自 1970 年 1 月 1 日开始的秒数。
plusMillis(long millisToAdd):增加指定毫秒数后的 Instant 对象。
minusNanos(long nanosToSubtract):减去指定纳秒数后的 Instant 对象。


5、java.time.Duration:表示两个时刻之间的持续时间或时间段,Duration类提供了很多有用的方法,例如:
getSeconds():获取Duration实例中的总秒数
toDays():获取Duration实例中的总天数
plus(long amountToAdd, TemporalUnit unit):将指定的时间单元添加到该Duration实例
plusHours(long hoursToAdd):将指定的小时数添加到该Duration实例
plusMinutes(long minutesToAdd):将指定的分钟数添加到该Duration实例


6、java.time.Period:表示两个日期之间的天数、月数或年数,Period类提供了很多有用的方法,例如:
getYears():获取Period实例中的年份差
getMonths():获取Period实例中的月份差
getDays():获取Period实例中的天数差
plusYears(long yearsToAdd):将指定的年数添加到该Period实例
plusMonths(long monthsToAdd):将指定的月数添加到该Period实例
plusDays(long daysToAdd):将指定的天数添加到该Period实例


7、java.time.ZonedDateTime:表示带时区的日期时间信息,ZonedDateTime类提供了很多有用的方法,例如:
getYear():获取年份
getMonth():获取月份
getDayOfMonth():获取月中的日期
getHour():获取小时数
getMinute():获取分钟数
getSecond():获取秒数
withZoneSameInstant(ZoneId zone):将时区调整为指定的时区,并以UTC时间表示
withZoneSameLocal(ZoneId zone):将时区调整为指定的时区,并以本地时间表示
plus(Duration amountToAdd):将指定的持续时间添加到该ZonedDateTime实例


8、java.time.DateTimeFormatter:用于格式化和解析日期时间信息,DateTimeFormatter类提供了很多有用的方法,例如:
ofLocalizedDate(FormatStyle dateStyle):获取指定格式样式的本地日期格式化器
ofLocalizedTime(FormatStyle timeStyle):获取指定格式样式的本地时间格式化器
ofLocalizedDateTime(FormatStyle dateTimeStyle):获取指定格式样式的本地日期时间格式化器
parse(CharSequence text, TemporalQuery query):将指定的日期时间字符串解析为指定类型的Temporal对象
parse(CharSequence text):将指定的日期时间字符串解析为LocalDateTime对象
另外,DateTimeFormatter还支持一些预定义的日期时间格式模板,例如:
"yyyy-MM-dd":代表年-月-日的格式
"HH:mm:ss":代表小时:分钟:秒的格式
"yyyy-MM-dd HH:mm:ss":代表年-月-日 小时:分钟:秒的格式

新旧时间的构造样例:

    @Test
    public void dateUseTest() {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        Date calendarTime = calendar.getTime();

        System.out.println("=============================旧的日期=============================");
        SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println("使用Date构造日期:" + simpleDate.format(date));
        System.out.println("使用Calendar构造日期:" + simpleDate.format(calendarTime));

        System.out.println("=============================旧的时间=============================");
        SimpleDateFormat simpleTime = new SimpleDateFormat("HH:mm:ss");
        System.out.println("使用Date构造时间:" + simpleTime.format(date));
        System.out.println("使用Calendar构造时间:" + simpleTime.format(calendarTime));

        System.out.println("=============================旧的日期和时间=============================");
        SimpleDateFormat simpleDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("使用Date构造日期和时间:" + simpleDateTime.format(date));
        System.out.println("使用Calendar构造日期和时间:" + simpleDateTime.format(calendarTime));

        System.out.println("=============================新的日期=============================");
        LocalDate ofDate = LocalDate.of(2019, 5, 12);
        LocalDate nDate = LocalDate.now();
        System.out.println("使用LocalDate.of构造日期:" + ofDate);
        System.out.println("使用LocalDate.now构造日期:" + nDate);

        System.out.println("=============================新的时间=============================");
        LocalTime ofTime = LocalTime.of(15, 01, 30);
        LocalTime time = LocalTime.now();
        System.out.println("使用LocalTime.of构造日期和时间:" + ofTime);
        System.out.println("使用LocalTime.now构造日期和时间:" + time);

        System.out.println("=============================新的日期和时间=============================");
        LocalDateTime ofDateTime = LocalDateTime.of(2019, 5, 12, 15, 01, 30);
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("使用LocalDateTime.of构造日期和时间:" + ofDateTime);
        System.out.println("使用LocalDateTime.now构造日期和时间:" + dateTime);

        System.out.println("=============================新的日期和时间格式化=============================");
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println("使用DateTimeFormatter格式化日期和时间:" + dateTime.format(formatter));
    }

新旧时间的内容获取样例:

    @Test
    public void dateGetTest() {
        System.out.println("=============================旧的方式获取日期时间信息=============================");
        Calendar calendar = Calendar.getInstance();
        System.out.println("使用Calendar获取年:" + calendar.get(Calendar.YEAR));
        //月是从0开始
        System.out.println("使用Calendar获取月:" + String.valueOf(calendar.get(Calendar.MONTH) + 1));
        System.out.println("使用Calendar获取日:" + calendar.get(Calendar.DAY_OF_MONTH));
        //获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期一、3代表星期二,以此类推)
        System.out.println("使用Calendar获取星期几:" + calendar.get(Calendar.DAY_OF_WEEK));
        System.out.println("使用Calendar获取时:" + calendar.get(Calendar.HOUR_OF_DAY));
        System.out.println("使用Calendar获取分:" + calendar.get(Calendar.MINUTE));
        System.out.println("使用Calendar获取秒:" + calendar.get(Calendar.SECOND));

        System.out.println("=============================新的方式获取日期时间信息=============================");
        //LocalDate和LocalTime同样有类似的方法,这里以LocalDateTime为例
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("使用LocalDateTime获取年:" + dateTime.getYear());
        System.out.println("使用LocalDateTime获取月:" + dateTime.getMonthValue());
        System.out.println("使用LocalDateTime获取日:" + dateTime.getDayOfMonth());
        System.out.println("使用LocalDateTime获取时:" + dateTime.getHour());
        System.out.println("使用LocalDateTime获取分:" + dateTime.getMinute());
        System.out.println("使用LocalDateTime获取秒:" + dateTime.getSecond());
    }

新旧时间的运算样例:

    @Test
    public void dateCalculateTest() {
        System.out.println("=============================旧的方式获取日期时间信息=============================");
        Calendar calendar = Calendar.getInstance();
        System.out.println("当前Calendar获取到的日期信息" + calendar.get(Calendar.YEAR) + "年" + calendar.get(Calendar.DAY_OF_MONTH) + "日" + calendar.get(Calendar.HOUR_OF_DAY) + "时");
        //加5天
        calendar.add(Calendar.DAY_OF_MONTH, 5);
        //减2年
        calendar.add(Calendar.YEAR, -2);
        //减1小时
        calendar.add(Calendar.HOUR_OF_DAY, -1);
        System.out.println("运算后Calendar获取到的日期信息" + calendar.get(Calendar.YEAR) + "年" + calendar.get(Calendar.DAY_OF_MONTH) + "日" + calendar.get(Calendar.HOUR_OF_DAY) + "时");

        System.out.println("=============================新的方式获取日期时间信息=============================");
        //LocalDate和LocalTime同样有类似的方法,这里以LocalDateTime为例
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("当前LocalDateTime获取到的日期信息" + dateTime.getYear() + "年" + dateTime.getDayOfMonth() + "日" + dateTime.getHour() + "时");
        //加10天
        dateTime = dateTime.plusDays(10);
        //减一年
        dateTime = dateTime.minusYears(1);
        //减两小时
        dateTime = dateTime.minusHours(2);
        System.out.println("运算后LocalDateTime获取到的日期信息" + dateTime.getYear() + "年" + dateTime.getDayOfMonth() + "日" + dateTime.getHour() + "时");

        System.out.println("=============================新的方式计算日期时间的差值=============================");
        //旧的日期时间没有现成的api去计算,需要自己去实现
        LocalDate lDate1 = LocalDate.of(2019, 1, 1);
        LocalDate lDate2 = LocalDate.now();
        Period period1 = Period.between(lDate1, lDate2);
        System.out.println("使用Period计算时间差为:" + period1.getYears() + "年" + period1.getMonths() + "月" + period1.getDays() + "天");
        Period period2 = period1.plusYears(1).plusMonths(2).plusDays(3);
        System.out.println("使用Period加上1年2月3天后的时间差为:" + period2.getYears() + "年" + period2.getMonths() + "月" + period2.getDays() + "天");

        LocalDateTime lDateTime1 = LocalDateTime.of(2019, 1, 1, 0, 0, 0);
        LocalDateTime lDateTime2 = LocalDateTime.now();
        Duration duration1 = Duration.between(lDateTime1, lDateTime2);
        System.out.println("使用Duration计算的时间差为:" + duration1.getSeconds() + "秒");
        System.out.println("使用Duration计算的时间差为:" + duration1.toDays() + "天");
        Duration duration2 = duration1.plusHours(2).plusMinutes(30).plusSeconds(10);
        System.out.println("使用Duration加上2小时30分10秒后的时间差为:" + duration2.getSeconds() + "秒");

        System.out.println("=============================新的方式调整日期时间=============================");
        LocalDate date = LocalDate.parse("2019-01-01");
        LocalDate firstDay = date.with(TemporalAdjusters.firstDayOfMonth());
        LocalDate lastDay = date.with(TemporalAdjusters.lastDayOfMonth());
        System.out.println("使用TemporalAdjusters调整后该月的第一天为:" + firstDay);
        System.out.println("使用TemporalAdjusters调整后该月的最后一天为:" + lastDay);
        LocalDate nextSunday = date.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
        System.out.println("使用TemporalAdjusters调整后下一个周日为:" + nextSunday);

        System.out.println("=============================新的方式带时区的日期时间=============================");
        ZonedDateTime zdt = ZonedDateTime.of(2019, 5, 14, 12, 0, 0, 0, ZoneId.of("Asia/Shanghai"));
        System.out.println("北京时间:" + zdt);
        System.out.println("年份:" + zdt.getYear());
        System.out.println("月份:" + zdt.getMonthValue());
        System.out.println("日期:" + zdt.getDayOfMonth());
        System.out.println("小时数:" + zdt.getHour());
        System.out.println("分钟数:" + zdt.getMinute());
        System.out.println("秒数:" + zdt.getSecond());
        ZonedDateTime zdt2 = zdt.withZoneSameInstant(ZoneId.of("UTC"));
        System.out.println("调整时区后的UTC时间:" + zdt2);
        ZonedDateTime zdt3 = zdt.plus(Duration.ofHours(5));
        System.out.println("加上5小时后的时间:" + zdt3);
    }

新旧时间的转换样例:

    @Test
    public void convertTest() {
        System.out.println("=============================将Date转换为Instant、LocalDateTime等类型=============================");
        Date date = new Date();
        Instant instant = date.toInstant();
        LocalDateTime localDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
        System.out.println("使用instant.atZone转换成LocalDateTime:" + localDateTime);
        ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
        System.out.println("使用instant.atZone转换成ZonedDateTime:" + zonedDateTime);

        localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        System.out.println("使用LocalDateTime.ofInstant转换成LocalDateTime:" + localDateTime);
        zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
        System.out.println("使用ZonedDateTime.ofInstant转换成ZonedDateTime:" + zonedDateTime);

        Calendar calendar = Calendar.getInstance();
        instant = calendar.toInstant();
        localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        System.out.println("使用LocalDateTime.ofInstant转换成LocalDateTime:" + localDateTime);
        zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
        System.out.println("使用ZonedDateTime.ofInstant转换成ZonedDateTime:" + zonedDateTime);

        System.out.println("=============================将Instant、LocalDateTime等类型转换为Date=============================");
        LocalDateTime nowDateTime = LocalDateTime.now();
        Instant instant1 = nowDateTime.atZone(ZoneId.systemDefault()).toInstant();
        Date date1 = new Date(instant1.toEpochMilli());
        System.out.println("使用new Date转换成Date:" + date1);
        Date date2 = Date.from(instant1);
        System.out.println("使用Date.from转换成Date:" + date2);

        System.out.println("=============================将LocalDate、LocalTime和LocalDateTime转换为Date=============================");
        LocalDate nowDate = LocalDate.now();
        Instant instant2 = nowDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
        Date date3 = Date.from(instant2);
        System.out.println("使用Date.from转换成Date:" + date3);

        LocalTime nowTime = LocalTime.now();
        nowDate = LocalDate.now();
        Instant instant3 = LocalDateTime.of(nowDate, nowTime).atZone(ZoneId.systemDefault()).toInstant();
        Date date4 = Date.from(instant3);
        System.out.println("使用Date.from转换成Date:" + date4);

        localDateTime = LocalDateTime.now();
        Instant instant4 = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
        Date date5 = Date.from(instant4);
        System.out.println("使用Date.from转换成Date:" + date5);

        System.out.println("=============================将Calendar转换为Instant、LocalDateTime等类型=============================");
        calendar = Calendar.getInstance();
        Date date6 = calendar.getTime();
        Instant instant5 = date6.toInstant();
        LocalDateTime nowTime1 = LocalDateTime.ofInstant(instant5, ZoneId.systemDefault());
        System.out.println("使用LocalDateTime.ofInstant转换成LocalDateTime:" + nowTime1);
    }