java8 的时间、日期处理类

概述:
在Java 8中,引入了一套全新的时间和日期API,位于java.time包中。这个包提供了一组全新的日期-时间API,主要类包括:

LocalDate - 表示没有时间和时区的日期(年-月-日)。
LocalTime - 表示没有日期和时区的时间(时-分-秒-纳秒)。
LocalDateTime - 表示没有时区的日期和时间。
ZonedDateTime - 表示带时区的日期和时间。
DateTimeFormatter - 用于日期时间的格式化和解析。
Instant - 表示时间线上的一个瞬时点(通常用于时间戳)。
Duration - 表示两个时刻之间的时间量(以秒和纳秒为单位)。
Period - 表示两个日期之间的时间量(以年、月、日为单位)。
ZoneId - 代表时区标识符。
ZoneOffset - 表示时区偏移量。
Clock - 用于获取当前的日期和时间。

这些新的日期时间类修正了以前的java.util.Date和java.util.Calendar中的许多问题,提供了更直观、更易用的API。以下是一些基本用法的例子:

LocalDate

LocalDate today = LocalDate.now(); // 获取当前日期
LocalDate specificDate = LocalDate.of(2020, Month.JANUARY, 25); // 创建一个指定的日期

LocalTime

LocalTime now = LocalTime.now(); // 获取当前时间
LocalTime specificTime = LocalTime.of(21, 30, 59); // 创建一个指定的时间

LocalDateTime

LocalDateTime currentDateTime = LocalDateTime.now(); // 获取当前日期和时间
LocalDateTime specificDateTime = LocalDateTime.of(2020, Month.JANUARY, 25, 21, 30, 59); //创建一个指定的日期和时间

ZonedDateTime

ZonedDateTime zonedDatetime = ZonedDateTime.now(); // 获取当前时区的日期和时间
ZonedDateTime zonedDatetimeInTokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo")); // 获取指定时区的日期和时间

DateTimeFormatter

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = currentDateTime.format(formatter); // 格式化日期时间
LocalDateTime parsedDateTime = LocalDateTime.parse("2020-01-25 21:30:59", formatter); // 解析日期时间字符串

Duration 和 Period

Duration duration = Duration.between(time1, time2); // 计算两个时间之间的持续时间
Period period = Period.between(date1, date2); // 计算两个日期之间的周期


这些类是不可变的并且是线程安全的,这意味着您可以在多线程环境中自由地使用,而不必担心线程安全问题。

关于Date和LocalDate的转换问题:
java8中Date转换成LocalDate
在Java 8中,可以使用Date类的toInstant()方法将Date对象转换为Instant对象,然后通过Instant与ZoneId来创建LocalDate对象。以下是转换过程的示例:

import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
 
public class DateToLocalDateExample {
    public static void main(String[] args) {
        // 创建一个Date对象
        Date date = new Date();
 
        // 将Date转换为LocalDate
        LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
 
        // 打印结果
        System.out.println("LocalDate: " + localDate);
    }
}
 

在这个示例中,首先使用Date对象的toInstant()方法将Date转换成Instant对象。然后,调用atZone(ZoneId.systemDefault())方法将Instant与系统默认时区结合,形成ZonedDateTime对象。最后,使用toLocalDate()方法从ZonedDateTime对象获取LocalDate对象。

需要注意的是,由于Date对象包含日期和时间,而LocalDate只包含日期,所以在转换过程中时间信息会丢失。如果需要保留时间信息,应该使用LocalDateTime而不是LocalDate。

java8中LocalDate如何转换成Date
在Java 8中,将LocalDate对象转换为Date对象需要使用LocalDate的atStartOfDay()方法来结合日期和当天的开始时间,然后通过ZoneId来指定时区,最终转换为Instant对象,该对象可以被转换为Date。以下是转换过程的示例:

import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
 
public class LocalDateToDateExample {
    public static void main(String[] args) {
        // 创建一个LocalDate对象
        LocalDate localDate = LocalDate.now();
 
        // 将LocalDate转换为Date
        Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
 
        // 打印结果
        System.out.println("Date: " + date);
    }
}
 

 

在这个示例中,localDate.atStartOfDay(ZoneId.systemDefault())将LocalDate对象与当天的开始时间(通常是午夜的00:00:00)结合,并且使用系统默认的时区,形成ZonedDateTime对象。然后,使用ZonedDateTime的toInstant()方法将其转换为Instant对象。最后,使用Date.from(Instant)方法从Instant对象创建出Date对象。

需要注意的是,LocalDate不包含时间信息,所以转换得到的Date对象将表示当天的开始时间(通常是午夜的00:00:00)。如果你的LocalDate对象代表的日期需要与特定的时间结合(不是开始时间),你可能需要使用LocalDateTime进行转换。
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值