概述:
在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进行转换。