您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页(十八)Java的时间与日期(2)

(十八)Java的时间与日期(2)

来源:五一七教育网


前言:

        JDK 8中增加了一套全新的日期时间API,这套API设计合理,是线程安全的。新的日期及时间API位于 java.time 包 中,下面是一些关键类。

  • LocalDate :表示日期,包含年月日,格式为 2019-10-16
  • LocalTime :表示时间,包含时分秒,格式为 16:38:54.158549300
  • LocalDateTime :表示日期时间,包含年月日,时分秒,格式为 2018-09-06T15:33:56.750
  • DateTimeFormatter :日期时间格式化类。
  • Instant:时间戳,表示一个特定的时间瞬间。
  • Duration:用于计算2个时间(LocalTime,时分秒)的距离
  • Period:用于计算2个日期(LocalDate,年月日)的距离
  • ZonedDateTime :包含时区的时间

  Java中使用的历法是ISO 8601日历系统,它是世界民用历法,也就是我们所说的公历。平年有365天,闰年是366 天。此外Java 8还提供了4套其他历法,分别是:

  • ThaiBuddhistDate:泰国佛教历
  • MinguoDate:中华历
  • JapaneseDate:日本历
  • HijrahDate:历

一、JDK8新增日期类

概述:

        从JDK8开始,java.time包提供了新的日期和时间API,主要涉及的类型有:

        新增的API严格区分了时刻,本地日期,本地时间,并且,对日期和时间进行运算更加方便。

        其次,新API的类型几乎全部是不可变类型(和String的使用类似),可以放心使用不必担心被修改。

二、LocalDate,LocalTime,LocalDateTime

1.概述:

        它们分别表示日期,时间,日期时间对象,它们的类的实例是不可变的对象。

        它们三者构建对象和API都是通用的。

2.构建对象的方法如下:

3.修改相关的API

        ①LocalDate综合了LocalDate和LocalTime里面的方法,所以下面只用LocalDate和LocalTime来举例。

        ②这些方法返回的是一个新的实例引用,因为LocalDateTime,LocalDate,LocalTime都是不可变的。

4.代码演示:

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
​
import static java.time.LocalTime.of;
​
/**
 * 从JDK8开始新增日期类(java.time包)
 * 1、localDate :不包含具体时间的日期(年月日)
 * 2、localTime : 不包含日期的时间(时分秒)
 * 3、localDateTime :包含了日期及时间(年月日时分秒)
 * 4、Instant :代表的是时间戳
 * 5、DateTimeFormatter 用于做时间的格式化和解析的
 * 6、Duration :用于计算两个时间间隔
 * 7、period :用于计算两个日期间隔
 * *新API严格区分了时刻、本地日期、本地时间。
 *
 * 构建对象的方式:
 * 1、public static XXXX now(); 静态方法,根据当前时间创建对象
 * 例如:LocaDate LocaDate = LocaDate.now();
 * 2、public static XXXX of(...); 静态方法,指定日期/时间创建对象
 * 例如:LocaDate LocaDate = LocaDate.of(2009,11,11);
 *
 * 修改相关API:
 * plusDays,plusWeeks,plusMonths,plusYears  :向当前LocalDate对象添加几天、几周、几月、几年。
 * minusDays,minusWeeks,minusMonths,minusYears :从当前LocalDate对象减去几天、几周、几月、几年。
 * withDayOfMonth,withDayOfYear,withDayOfMonth,withYear :将月份天数、年份天数、月份、年份修改为指定的值并返回新的localDate对象
 * isBefore,isAfter :比较两个LocalDate
 */
public class time_Test {
    public static void main(String[] args) {
        LocalTime nowTime = LocalTime.now();
        System.out.println(nowTime);
        System.out.println(nowTime.minusHours(1));//一个小时前
        System.out.println(nowTime.plusHours(1));//一个小时后
​
        System.out.println("-----------------------");
        LocalTime myDate = of(2018,9,5);
        LocalTime nowDate = LocalTime.now();
        System.out.println("今天是2018-09-06吗?" + nowDate.equals(myDate));
        System.out.println(myDate+"是否在"+nowDate+"之前?"+myDate.isBefore(nowDate));
        System.out.println(myDate+"是否在"+nowDate+"之后?"+myDate.isAfter(nowDate));
        System.out.println("-------------------");
        //判断今天是否是你的生日?
        LocalDate birDate = LocalDate.of(2002,12,12);
        LocalDate nowDate1 = LocalDate.now();
​
        MonthDay birMD = MonthDay.of(birDate.getMonthValue(),birDate.lengthOfMonth());
        MonthDay nowMD = MonthDay.from(nowDate1);
        System.out.println("今天是你的生日吗?"+birMD.equals(nowMD));
​
​
        //时间戳:Instant
        Instant instant = Instant.now();
        System.out.println("当前时间戳是:"+instant);
​
        Date date = Date.from(instant);
        System.out.println("当前时间戳是:"+date);
​
        instant = date.toInstant();
        System.out.println(instant);
​
        // DateTimeFormatter 用于做时间的格式化和解析的
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);
        // 解析/格式化器
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
        //正向格式化 :格式化器格式日期
        System.out.println(dtf.format(ldt));
        //逆向格式化 : 日期格式 格式化器
        System.out.println(ldt.format(dtf));
        //解析字符串时间
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String dateStr ="2019-11-12 11-11-11";
        //解析当前字符串成为本地日期时间对象
        LocalDateTime ldt1 = LocalDateTime.parse("2019-11-12 11:11:11",dtf1);
        System.out.println(ldt1);
​
        System.out.println(ldt1.getDayOfYear());
​
        //period :用于计算两个日期间隔  ,只能精确到年月日(java.time.period)
        //当前年月日
        LocalDate today=LocalDate.now();
        System.out.println(today);
        //生日的年月日
        LocalDate birthDate = LocalDate.of(1998,10,12);
        System.out.println(birthDate);
​
        Period period = Period.between(birthDate,today);
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
​
        //Duration :用于计算两个时间间隔
        LocalDateTime today1 =LocalDateTime.now();
        System.out.println(today1);
​
        //生日的年月日
        LocalDateTime birthDate1 = LocalDateTime.of(1998,10,12,20,00,00);
        System.out.println(birthDate1);
​
        Duration duration = Duration.between(today1,birthDate1);//第二个参数减第一个参数
        System.out.println(duration.toDays());//两个时间的天数
        System.out.println(duration.toHours());//两个时间差的小时数
        System.out.println(duration.toMinutes());//两个时间差的分钟数
        System.out.println(duration.toMillis());//两个时间差的毫秒数
        System.out.println(duration.toNanos());//两个时间差的秒数
    }
}

三、Instant时间戳

1.概述:

        JDK8获取时间戳特别简单,且功能更丰富。Instant类由一个静态的工厂方法now()可以返回当前时间戳。

        时间戳是包含日期和时间的,与java.util.Date很类似,事实上Instant就是类似JDK8以前的Date。

        Instant和Date这两个类可以进行转换。

2.代码演示:

import java.time.Instant;
import java.time.ZoneId;
import java.util.Date;
​
public class Instant_Test {
    public static void main(String[] args) {
        //时间戳:Instant
        Instant instant = Instant.now();
        System.out.println("当前时间戳是:"+instant);
​
        Date date = Date.from(instant);
        System.out.println("当前时间戳是:"+date);
​
        instant = date.toInstant();
        System.out.println(instant);
        //2.系统此刻的时间戳怎么办?
        Instant instant1 = Instant.now();
        System.out.println(instant1.atZone(ZoneId.systemDefault()));
        //3.如何转成Date对象
        Date date1 = Date.from(instant);
        System.out.println("当前时间戳是:"+date);
    }
}

四、DateTimeFormatter类

1.概述:

        在JDK8中,引入了一个全新的日期与时间格式器DateTimeFormatter。

        正反都能调用format方法。

2.代码演示:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
​
public class DateTmeFormatter_Test {
    public static void main(String[] args) {
        // DateTimeFormatter 用于做时间的格式化和解析的
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);
        // 解析/格式化器
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
        //正向格式化 :格式化器格式日期
        System.out.println(dtf.format(ldt));
        //逆向格式化 : 日期格式 格式化器
        System.out.println(ldt.format(dtf));
        //解析字符串时间
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String dateStr ="2019-11-12 11-11-11";
        //解析当前字符串成为本地日期时间对象
        LocalDateTime ldt1 = LocalDateTime.parse("2019-11-12 11:11:11",dtf1);
        System.out.println(ldt1);
​
        System.out.println(ldt1.getDayOfYear());
    }
}

五、Duration/Period类

1.Period概述:

        在java8中,我们可以使用以下类来计算日期间隔差异:java.time.Period

        主要是Period类方法getYear(),getMonths()和getDays()来计算,只能精确到年月日。

        用于LocalDate之间的比较。

2.代码演示:

import java.time.LocalDate;
import java.time.Period;
​
public class Period_Test {
    public static void main(String[] args) {
        //period :用于计算两个日期间隔  ,只能精确到年月日(java.time.period)
        //当前年月日
        LocalDate today =LocalDate.now();
        System.out.println(today);
        //生日的年月日
        LocalDate birthDate = LocalDate.of(1998,10,12);
        System.out.println(birthDate);
​
        Period period = Period.between(birthDate,today);
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
    }
}

3.Duration概述:

        在java8中,我们可以使用以下类来计算日期间隔差异:java.time.Duration

        提供了使用基于时间的值测量时间量的方法。

        用于LocalDateTime之间的比较,也可用于Instant之间的比较。

4.代码演练:

import java.time.Duration;
import java.time.LocalDateTime;
​
public class Duration_Test {
    public static void main(String[] args) {
        //Duration :用于计算两个时间间隔
        LocalDateTime today1 =LocalDateTime.now();
        System.out.println(today1);
        //生日的年月日
        LocalDateTime birthDate1 = LocalDateTime.of(1998,10,12,20,00,00);
        System.out.println(birthDate1);
​
        Duration duration = Duration.between(birthDate1,today1);//第二个参数减第一个参数
        System.out.println(duration.toDays());//两个时间的天数
        System.out.println(duration.toHours());//两个时间差的小时数
        System.out.println(duration.toMinutes());//两个时间差的分钟数
        System.out.println(duration.toMillis());//两个时间差的毫秒数
        System.out.println(duration.toNanos());//两个时间差的秒数
    }
}

六、ChronoUnit类

1.概述:

        java.time.temporal.ChronoUnit

        ChronoUnit类可用于在单个时间单位内测量一段时间,这个工具类是最全的,可以用于比较所有的时间单位。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务