文档章节

Java 8 之 java.time 包

GreenDay
 GreenDay
发布于 2014/04/09 18:10
字数 895
阅读 179
收藏 6

包概述

java.time 包是在JDK8新引入的,提供了用于日期、时间、实例和周期的主要API。

java.time包定义的类表示了日期-时间概念的规则,包括instants, durations, dates, times, time-zones and periods。这些都是基于ISO日历系统,它又是遵循 Gregorian规则的。

所有类都是不可变的、线程安全的。

一些类的介绍

  • LocalDateTime:存储了日期和时间,如:2013-10-15T14:43:14.539

  • LocalDate:存储了日期,如:2013-10-15

  • LocalTime:存储了时间,如:14:43:14.539

上面的类可以由下面的类组合来:

类之间转换的示例:

LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("localDateTime :" + localDateTime);

LocalDate localDate = LocalDate.now();
System.out.println("localDate :" + localDate);

LocalTime localtime = LocalTime.now();
System.out.println("localtime :" + localtime);

//  获取当前年份
Year year = Year.now();
System.out.println("year :" + year);
//   从Year获取LocalDate
LocalDate localDate1 = year.atDay(59);
System.out.println("localDate1 :" + localDate1);
//  把LocalTime关联到一个LocalDate得到一个LocalDateTime
LocalDateTime localDateTime1 = localtime.atDate(localDate1);
System.out.println("localDateTime1 :" + localDateTime1);

//  用指定的年获取一个Year
Year year1 = Year.of(2012);
System.out.println("year1 :" + year1);

//  从Year获取YearMonth
YearMonth yearMonth = year1.atMonth(2);
System.out.println("yearMonth :" + yearMonth);
//  YearMonth指定日得到 LocalDate
LocalDate localDate2 = yearMonth.atDay(29);
System.out.println("localDate2 :" + localDate2);
//  判断是否是闰年
System.out.println("isLeapYear :" + localDate2.isLeapYear());

//自动处理闰年的2月日期
//创建一个 MonthDay
MonthDay monthDay = MonthDay.of(2, 29);
LocalDate leapYear = monthDay.atYear(2012);
System.out.println("leapYear :" + leapYear);

//同一个 MonthDay 关联到另一个年份上
LocalDate nonLeapYear = monthDay.atYear(2011);
System.out.println("nonLeapYear :" + nonLeapYear);

上面代码的输出结果为:

localDateTime :2013-10-15T15:11:57.489
localDate :2013-10-15
localtime :15:11:57.489
year :2013
localDate1 :2013-02-28
localDateTime1 :2013-02-28T15:11:57.489
year1 :2012
yearMonth :2012-02
localDate2 :2012-02-29
isLeapYear :true
leapYear :2012-02-29
nonLeapYear :2011-02-28

格式化与时间计算

续前面的代码:

DayOfWeek dayOfWeek = DayOfWeek.of(1);
System.out.println("dayOfWeek :" + dayOfWeek);

//计算两个日期之间的天数,还可以按其他时间单位计算两个时间点之间的间隔。
long between = ChronoUnit.DAYS.between(localDate, leapYear);
System.out.println("between :" + between);

// 线程安全的格式化类,不用每次都new个SimpleDateFormat
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu MM dd");

//  把日期时间转换为字符串标识
System.out.println("date formatter :" + dateTimeFormatter.format(nonLeapYear));

//  解析字符串形式的日期时间
TemporalAccessor temporalAccessor = dateTimeFormatter.parse("2013 01 15");
System.out.println("temporalAccessor :" + LocalDate.from(temporalAccessor));

Instant instant = Instant.now(); //  时间戳
System.out.println("instant :" + instant);

//计算某月的第一天的日期
LocalDate with = nonLeapYear.with(TemporalAdjuster.firstDayOfMonth());
System.out.println("with :" + with);

// 计算某月的第一个星期一的日期
TemporalAdjuster temporalAdjuster = TemporalAdjuster.firstInMonth(DayOfWeek.MONDAY);
LocalDate with1 = localDate.with(temporalAdjuster);
System.out.println("with1 :" + with1);

// 计算localDate的下一个星期一的日期
LocalDate with2 = localDate.with(TemporalAdjuster.next(DayOfWeek.MONDAY));
System.out.println("with2 :" + with2);

输出:

dayOfWeek :MONDAY
between :-594
date formatter :2011 02 28
temporalAccessor :2013-01-15
instant :2013-10-15T07:55:30.964Z
with :2011-02-01
with1 :2013-10-07
with2 :2013-10-21

java.util.Date到新库类的转换

转换可通过下面的方法进行。

Date.toInstant()
Date.from(Instant)
Calendar.toInstant()

方法概览

该包的API提供了大量相关的方法,这些方法一般有一致的方法前缀:

  • of:静态工厂方法。

  • parse:静态工厂方法,关注于解析。

  • get:获取某些东西的值。

  • is:检查某些东西的是否是true。

  • with:不可变的setter等价物。

  • plus:加一些量到某个对象。

  • minus:从某个对象减去一些量。

  • to:转换到另一个类型。

  • at:把这个对象与另一个对象组合起来,例如:date.atTime(time)

想起以前做报表都是在存储过程里处理日期的,因为Java的日期操作确实太弱了。有了Java 8,妈妈再也不用担心我处理日期了。


本文转载自:http://coderbee.net/index.php/java/20131015/503

GreenDay
粉丝 7
博文 21
码字总数 4972
作品 0
闵行
程序员
私信 提问
java8中的时间处理0 - api介绍

Java 8 Date Time API是我们java开发一直寻找的时间处理工具。java从一开始设计的时间类就让人头疼,好在现在终于有了java8。 为什么我们需要这套API 只要是有这么几个理由: Java的日期和时...

davelet
2018/02/22
0
0
String、Date和Timestamp的互转

String、Date和Timestamp的互转 String和Date的互转 关于String和Date的互转,在java8后会有不同。因为java8添加java.time包及子包,其中主要API是关于日期、时间、时刻和时间段及它们之间的...

mingmingcome
2018/08/21
0
0
java 8 时间api 使用

java 8 提供的 时间api java.time 比原来的Calendar 方便很多。主要提供了 日期类:LocalDate 时间类:LocateDateTime 时间戳操作类:Instant 时间持续时间计算:Duration 时区:ZoneId 日期...

翱翔fly
2017/11/08
911
2
java 8 新特性 时间api使用实例

java 8 提供的 时间api java.time 比原来的Calendar 方便很多。主要提供了 日期类:LocalDate 时间类:LocateDateTime 时间戳操作类:Instant 时间持续时间计算:Duration 时区:ZoneId 日期...

翱翔fly
2017/11/01
21
0
DataNucleus Access Platform 4.0 M2 发布

DataNucleus Access Platform 4.0 M2 发布,该版本增加对 Java 8 的支持,支持持久化绝大多数的 java.time 类型;支持多列的 TypeConverters 和列的宽度定义;支持 Cassandra 乐观检查、接口...

oschina
2014/04/04
295
1

没有更多内容

加载失败,请刷新页面

加载更多

官方来源的 Duo Mobile App 解决了我的 Network Difficulties 问题

https://help.duo.com/s/article/2094?language=en_US 我利用百度搜索下载了一个 Duo Mobile App (由于 Google Play)在大陆不可用。 在扫描旧手机上的 Duo Mobile App 的二维码时, 显示出错...

圣洁之子
3分钟前
1
0
Zabbix监控Mysql容器(Docker容器)主从是否存活

1、在Zabbix Web端创建模板

abowu
4分钟前
1
0
基于 RocketMQ 的同城双活架构在美菜网的挑战与实践

本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践。 嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础...

大涛学长
10分钟前
1
0
设计模式之:外观模式和桥接模式

作者:DevYK 链接:https://juejin.im/post/5d7e01f4f265da03b5747aac 外观模式 介绍 外观模式 (Facade) 在开发过程中的运用评率非常高,尤其是在现阶段,各种第三方 SDK “充斥” 在我们周边...

Java架构Monster
12分钟前
1
0
人证合一核验设备

人脸身份验证机,人证合一设备1:N如我们现在在车站或一些重要的场所如步行街、城中村等人流密集的场所应用的人脸识别布控系统,其特点是动态和非配合。所谓的动态也就是识别的不是照 片,不是...

非思丸智能
13分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部