全面解析Java日期时间API( 四 )

使用DateTimeFormatter完成解析字符串
//获得 LocalDate实例,从使用特定格式的文本字符串解析,文字使用格式化程序解析,返回一个日期 。LocalDate localDate = LocalDate.parse("2018/11/11",DateTimeFormatter.ofPattern("yyyy/MM/dd"));System.out.println(localDate); //2018-11-11Instant
Instant 表示时间线上的一点(与 Date 类似),它只是简单地表示自 1970 年 1 月 1 日 0 时 0 分 0 秒(UTC)开始的秒数 。
Instant 由两部分组成,一是从原点开始到指定时间点的秒数 s,二是距离该秒数 s 的纳秒数 。它以 Unix 时间戳的形式存储日期时间,不提供处理人类意义上的时间单位(年月日等) 。
你可以通过Instant类的工厂方法创建一个Instant实例
//调用instant.now()来创建一个确切的表达当前时间的Instant对象.另外也有一些其它方法能创建Instant,具体请查阅Java官方文档 。Instant now = Instant.now();Instant later = now.plusSeconds(3);Instant earlier = now.minusSeconds(3);//第一个参数是秒,第二个是纳秒参数,纳秒的存储范围是0至999,999,999//2s之后的在加上100万纳秒(1s)Instant instant = Instant.ofEpochSecond(2,1000000000);System.out.println(instant); //1970-01-01T00:00:03ZInstant instant1 = Instant.now();System.out.println(instant1); //2019-05-31T16:19:28.719ZInstant instant2 = Instant.parse("2018-11-11T10:12:35.342Z");System.out.println(instant2); //2018-11-11T10:12:35.342Z//java.util.Date与Instant可相互转换Instant timestamp = new Date().toInstant();Date.from(Instant.now());//为了更好的显示,代码改写为Date date = new Date();Instant timestamp = date.toInstant();System.out.println(date);System.out.println(timestamp);Instant now1 = Instant.now();Date date1 = Date.from(now1);System.out.println(now1);System.out.println(date1);//输出结果Sat Jun 01 00:29:42 GMT+08:00 20192019-05-31T16:29:42.566Z2019-05-31T16:29:42.588ZSat Jun 01 00:29:42 GMT+08:00 2019Clock
Clock用于查找当前时刻,可以用来获取某个时区下当前的日期和时间,也可以用来代替旧的System.currentTimeMillis()方法和TimeZone.getDefault()方法 。
//返回系统默认时间Clock clock = Clock.systemDefaultZone();System.out.println(clock.instant().toString());//世界协调时UTCClock clock = Clock.systemUTC(); //通过Clock获取当前时刻 System.out.println("当前时刻为:" + clock.instant()); //获取clock对应的毫秒数,与System.currentTimeMillis()输出相同 System.out.println(clock.millis()); System.out.println(System.currentTimeMillis()); Duration
一个Duration实例是不可变的,当创建出对象后就不能改变它的值了 。你只能通过Duration的计算方法,来创建出一个新的Durtaion对象 。你会在之后的教程中见到的 。一个Duration对象表示两个Instant间的一段时间 。
创建Duration实例,使用Duration类的工厂方法来创建一个Duration对象
Instant first = Instant.now();// wait some time while something hAppensInstant second = Instant.now();Duration duration = Duration.between(first, second);//获得Duration表示秒数,然后获得在此期间的分钟数、小时数、天数Duration d = Duration.ofSeconds(6000); System.out.println("6000秒相当于" + d.toMinutes() + "分"); System.out.println("6000秒相当于" + d.toHours() + "小时"); System.out.println("6000秒相当于" + d.toDays() + "天"); 访问Duration的时间
一个Duration对象里有两个域:纳秒值(小于一秒的部分),秒钟值(一共有几秒),他们的组合表达了时间长度 。注意与使用System.getCurrentTimeMillis()时不同,Duration不包含毫秒这个属性 。
你可以通过以下两个方法得到它们的值:getSeconds()和getNano()
Period
Period 是以年月日来衡量一个时间段,用于计算两个日期间隔,所以 between() 方法只能接收 LocalDate 类型的参数 。
LocalDate start = LocalDate.of(2018, Month.JANUARY, 1);LocalDate end = LocalDate.of(2020, Month.NOVEMBER, 11);System.out.println("相隔月数:"+Period.between(start, end).getMonths());System.out.println("相隔天数:"+Period.between(start, end).getDays());//输出结果相隔月数:10相隔天数:10值得注意的是,Period 得到的是差值的绝对值(对应年月日直接计算数学上的差值),而并不表示真正的区间距离 。
long distanceMonth = start.until(end, ChronoUnit.MONTHS);long distanceDay= start.until(end, ChronoUnit.DAYS);System.out.println("相隔月数"+distanceMonth);System.out.println("相隔天数"+distanceDay);//输出结果相隔月数:34相隔天数:1045ZonedDateTime和ZonedId
ZonedDateTime类是Java 8中日期时间功能里,用于表示带时区的日期与时间信息的类 。ZonedDateTime 类的值是不可变的,所以其计算方法会返回一个新的ZonedDateTime 实例 。


推荐阅读