java8 的时间、日期处理类

发布时间:2024年01月09日

概述:

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

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

这些新的日期时间类修正了以前的java.util.Datejava.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对象,然后通过InstantZoneId来创建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对象需要使用LocalDateatStartOfDay()方法来结合日期和当天的开始时间,然后通过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对象。然后,使用ZonedDateTimetoInstant()方法将其转换为Instant对象。最后,使用Date.from(Instant)方法从Instant对象创建出Date对象。

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

文章来源:https://blog.csdn.net/n888168/article/details/135466103
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。