标签:
陪同lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java措置惩罚惩罚日期、日历和时间的方法一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安适使其应用非常受限。Java也意识到需要一个更好的 API来满足社区中已经习惯了使用JodaTime API的人们。全新API的众多好处之一就是,明确了日期时间观点,例如:瞬时(instant)、 是非(duration)、日期、时间、时区和周期。同时担任了Joda库按人类语言和计算机各自解析的时间措置惩罚惩罚方法。差别于老版本,新API基于ISO标准日历系统,java.time包下的所有类都是不成变类型而且线程安适。下面是新版API中java.time包里的一些关键类:Ins陪同lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java措置惩罚惩罚日期、日历和时间的方法一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安适使其应用非常受限。Java也意识到需要一个更好的 API来满足社区中已经习惯了使用JodaTime API的人们。全新API的众多好处之一就是,明确了日期时间观点,例如:瞬时(instant)、 是非(duration)、日期、时间、时区和周期。同时担任了Joda库按人类语言和计算机各自解析的时间措置惩罚惩罚方法。差别于老版本,新API基于ISO标准日历系统,java.time包下的所有类都是不成变类型而且线程安适。下面是新版API中java.time包里的一些关键类:
Instant:瞬时实例。
LocalDate:本地日期,不包罗具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。
LocalTime:本地时间,不包罗日期。
LocalDateTime:组合了日期和时间,但不包罗时差和时区信息。
ZonedDateTime:最完整的日期时间,包罗时区和相对UTC或格林威治的时差。
新API还引入了ZoneOffSet和ZoneId类,使得解决时区问题更为简便。解析、格局化时间的DateTimeFormatter类也全部从头设 计。注意,这篇文章是我在一年前Java 8即将颁布时写的,以下示例代码中的时间都是那一年的,当运行这些例子时会返回你当前的时间。
在Java 8中如何措置惩罚惩罚日期和时间
常有人问我学习一个新库的最好方法是什么?我的答案是在实际项目中使用它。项目中有很多真正的需求差遣开发者去发掘并学习新库。简单得说就是任务驱动学习探 索。这对Java 8新日期时间API也不例外。我创建了20个基于任务的实例来学习Java 8的新特性。从最简单创建当天的日期开始,然后创建时间及时区,接着模拟一个日期提醒应用中的任务——计算重要日期的到期天数,例如生日、纪念日、账单 日、保费到期日、信用卡过期日等。
示例 1、在Java 8中获取今天的日期
Java 8 中的 LocalDate 用于暗示当天日期。和java.util.Date差别,它只有日期,不包罗时间。当你仅需要暗示日期时就用这个类。
LocalDate today = LocalDate.now();
System.out.println("Today‘s Local date : " + today);
Output
Today‘s Local date : 2014-01-14
上面的代码创建了当天的日期,不含时间信息。打印出的日期格局非常友好,不像老的Date类打印出一堆没有格局化的信息。
示例 2、在Java 8中获取年、月、日信息
LocalDate类供给了获取年、月、日的快捷要领,其实例还包罗很多其它的日期属性。通过挪用这些要领就可以很便利的得到需要的日期信息,不用像以前一样需要依赖java.util.Calendar类了。
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.printf("Year : %d Month : %d day : %d t %n", year, month, day);
Output
Today‘s Local date : 2014-01-14
Year : 2014 Month : 1 day : 14
看到了吧,在Java 8 中得到年、月、日信息是这么简单直不雅观,想用就用,没什么需要记的。比拟看看以前Java是怎么措置惩罚惩罚年月日信息的吧。
示例 3、在Java 8中措置惩罚惩罚特定日期
在 第一个例子里,我们通过静态工厂要领now()非常容易地创建了当天日期,,你还可以挪用另一个有用的工厂要领LocalDate.of()创建任意日期, 该要领需要传入年、月、日做参数,返回对应的LocalDate实例。这个要领的好处是没再犯老API的设计错误,好比年度起始于1900,月份是从0开 始等等。日期所见即所得,就像下面这个例子暗示了1月14日,没有任何隐藏机关。
LocalDate dateOfBirth = LocalDate.of(2010, 01, 14);
System.out.println("Your Date of birth is : " + dateOfBirth);
Output : Your Date of birth is : 2010-01-14
可以看到创建的日期完全切合预期,与你写入的2010年1月14日完全一致。