Java8新特性整理之新的时间和日期API(终章)

本文深入探讨Java8的新时间日期API,包括LocalDate、LocalTime、LocalDateTime和Instant的使用,介绍了创建、操纵、解析、格式化日期和时间的方法,以及处理时区和时间间隔的技巧,强调了新API的线程安全和不可变性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

Java8之前我们使用DateCalendar这两个类处理时间,但有的特性只在某一个类有提供,比如用
于以语言无关的方式格式化和解析日期或时间的DateFormat方法就只在Date类里有。DateFormat方法也有它自己的问题。

比如,它不是线程安全的。这意味着两个线程如果尝试使用同一个formatter解析日期,你可能会得到无法预期的结果。

最后,Date和Calendar类都是可以变的。能把2014年3月18日修改成4月18日意味着什么呢?

这种设计会将你拖入维护的噩梦,接下来我们从最基本的用例入手,比如创建同时适合人与机器的日期和时间,逐渐转入到日期和时间API更高级的一些应用,比如
操纵、解析、打印输出日期-时间对象,使用不同的时区。

JDK1.8提供的日期处理类都是不可变对象,所以是线程安全的。

使用 LocalDate 和 LocalTime

开始使用新的日期和时间API时,你最先碰到的可能是LocalDate类。该类的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息。另外,它也不附带任何与时区相关
的信息。

创建一个LocalDate对象并读取其值 :

@Test
public void testLocalDateOf() {
    LocalDate localDate = LocalDate.of(2017, 12, 12);
    int year = localDate.getYear();
    int month = localDate.getMonthValue();
    int day = localDate.getDayOfWeek().getValue();
    int maxLength = localDate.getMonth().maxLength();
    int minLength = localDate.getMonth().minLength();
    boolean isLeap = localDate.isLeapYear();
    System.out.println("TimeTest.testLocalDateOf year: " + year + "\tmonth: " + month + "\tday: " + day
            + "\tmaxLength: " + maxLength + "\tminLength: " + minLength + "\tisLeap: " + isLeap);
}

获取当前的日期:

LocalDate now = LocalDate.now();

使用TemporalField读取LocalDate的值

TemporalField是一个接口,它定义了如何访问temporal对象某个字段的值。ChronoField枚举类实现了这一接口,所以你可以很方便地使用get方法得到枚举元素的值:

@Test
public void testTemporalField() {
    LocalDate localDate = LocalDate.of(2017, 12, 12);
    int year = localDate.get(ChronoField.YEAR);
    int month = localDate.get(ChronoField.MONTH_OF_YEAR);
    int day = localDate.get(ChronoField.DAY_OF_MONTH);

    System.out.println("TimeTest.testTemporalField year: " + year + "\tmonth: " + month + "\tday: " + day);
}

创建LocalTime并读取其值

@Test
public void testLocalTime() {
    LocalTime time = LocalTime.of(14, 22, 28);
    int hour = time.getHour();
    int minute = time.getMinute();
    int second = time.getSecond();
    System.out.println("TimeTest.testLocalTime hour: " + hour + "\tminute: " + minute + "\tsecond: " + second);
}

LocalDate和LocalTime都可以通过解析代表它们的字符串创建。使用静态方法parse

LocalDate date = LocalDate.parse("2017-12-12"); 
LocalTime time = LocalTime.parse("14:22:28"); 

合并日期和时间

这个复合类名叫LocalDateTime,是LocalDate和LocalTime的合体。它同时表示了日期和时间,但不带有时区信息,你可以直接创建,也可以通过合并日期和时间对象构造:

@Test
public void testLocalDateTimeCombine() {
    LocalDate date = LocalDate.of(2017, 12, 12);
    LocalTime time = LocalTime.of(14, 22, 28);

    LocalDateTime dt1 = LocalDateTime.of(2017, Month.MARCH, 12, 14, 22, 28);
    LocalDateTime dt2 = LocalDateTime.of(date, time);
    LocalDa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值