Java 8 日期和时间 API

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

Java 8 引入了新的日期和时间 API,该 API 受到了 JodaTime 库的启发。它克服了现有日期 API 的缺点。在本实验中,我们将学习如何使用新的日期和时间 API 来操作日期和时间。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("`Java`")) -.-> java/BasicSyntaxGroup(["`Basic Syntax`"]) java(("`Java`")) -.-> java/StringManipulationGroup(["`String Manipulation`"]) java(("`Java`")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["`Object-Oriented and Advanced Concepts`"]) java(("`Java`")) -.-> java/ConcurrentandNetworkProgrammingGroup(["`Concurrent and Network Programming`"]) java(("`Java`")) -.-> java/SystemandDataProcessingGroup(["`System and Data Processing`"]) java/BasicSyntaxGroup -.-> java/output("`Output`") java/StringManipulationGroup -.-> java/strings("`Strings`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("`Classes/Objects`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/class_methods("`Class Methods`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/date("`Date`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/format("`Format`") java/ConcurrentandNetworkProgrammingGroup -.-> java/working("`Working`") java/SystemandDataProcessingGroup -.-> java/system_methods("`System Methods`") subgraph Lab Skills java/output -.-> lab-117466{{"`Java 8 日期和时间 API`"}} java/strings -.-> lab-117466{{"`Java 8 日期和时间 API`"}} java/classes_objects -.-> lab-117466{{"`Java 8 日期和时间 API`"}} java/class_methods -.-> lab-117466{{"`Java 8 日期和时间 API`"}} java/date -.-> lab-117466{{"`Java 8 日期和时间 API`"}} java/format -.-> lab-117466{{"`Java 8 日期和时间 API`"}} java/working -.-> lab-117466{{"`Java 8 日期和时间 API`"}} java/system_methods -.-> lab-117466{{"`Java 8 日期和时间 API`"}} end

创建 LocalDate 实例

LocalDate 类用于表示标准 ISO 格式(yyyy-mm-dd)的日期。它不包含时间,也不支持时区。

我们可以使用 now() 方法创建 LocalDate 类的实例。它会根据系统时钟捕获当前日期。

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currentDate = LocalDate.now();
        System.out.println("Current Date: " + currentDate);
    }
}

使用以下命令保存并执行代码:

javac DateTimeExample.java && java DateTimeExample

我们将看到以下输出:

Current Date: 2021-08-13

解析日期字符串

我们可以使用日期的字符串表示形式来创建 LocalDate 类的实例。

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        String str = "2021-08-13";
        LocalDate date = LocalDate.parse(str);
        System.out.println("Date: " + date);
    }
}

使用以下命令保存并执行代码:

javac DateTimeExample.java && java DateTimeExample

我们将看到以下输出:

Date: 2021-08-13

加法和减法方法

我们可以使用 plusDays()minusDays() 方法在日期上添加或减去天数、月数或年数。我们也有类似的方法来调整月份和年份。

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        LocalDate yesterday = currDate.minusDays(1);
        LocalDate tomorrow = currDate.plusDays(1);

        System.out.println("Current Date: " + currDate);
        System.out.println("Tomorrow's Date: " + tomorrow);
        System.out.println("Yesterday's Date: " + yesterday);
    }
}

使用以下命令保存并执行代码:

javac DateTimeExample.java && java DateTimeExample

我们将看到以下输出:

Current Date: 2021-08-13
Tomorrow's Date: 2021-08-14
Yesterday's Date: 2021-08-12

Getter 方法

LocalDate 类包含多个 getter 方法,用于从 LocalDate 中获取不同的信息,例如获取星期几或月份中的某一天等。

import java.time.DayOfWeek;
import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        DayOfWeek dayOfWeek = currDate.getDayOfWeek();
        int dayOfMonth = currDate.getDayOfMonth();
        int dayOfYear = currDate.getDayOfYear();

        System.out.println("Date: " + currDate);
        System.out.println("Day of Week: " + dayOfWeek);
        System.out.println("Day of Month: " + dayOfMonth);
        System.out.println("Day of Year: " + dayOfYear);
    }
}

使用以下命令保存并执行代码:

javac DateTimeExample.java && java DateTimeExample

我们将看到以下输出:

Date: 2021-08-13
Day of Week: FRIDAY
Day of Month: 13
Day of Year: 225

比较日期

我们可以使用 isBefore()isAfter() 方法来比较日期,以检查哪个日期更大。

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        LocalDate tomorrow = currDate.plusDays(1);
        LocalDate yesterday = currDate.minusDays(1);

        System.out.println("Current date is after yesterday's date: " + currDate.isAfter(yesterday));
        System.out.println("Current date is before tomorrow's date: " + currDate.isBefore(tomorrow));
    }
}

使用以下命令保存并执行代码:

javac DateTimeExample.java && java DateTimeExample

我们将看到以下输出:

Current date is after yesterday's date: true
Current date is before tomorrow's date: true

创建 LocalTime 实例

要创建 LocalTime 实例,我们可以使用 now()of()parse() 方法。now() 方法会使用系统的时钟获取当前时间。of()parse() 方法可以根据传入的参数创建 LocalTime

import java.time.LocalTime;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalTime currentTime = LocalTime.now();
        LocalTime t1 = LocalTime.of(5, 32, 44);
        LocalTime t2 = LocalTime.parse("05:32:44");

        System.out.println(currentTime);
        System.out.println(t1);
        System.out.println(t2);
    }
}

使用以下命令保存并执行代码:

javac DateTimeExample.java && java DateTimeExample

我们将看到以下输出:

17:43:08.749240
05:32:44
05:32:44

加法和减法方法

我们可以使用 plus()minus() 方法来操作 LocalTime 实例。

import java.time.LocalTime;
import java.time.temporal.ChronoUnit;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalTime t1 = LocalTime.of(5, 32, 44);
        LocalTime t2 = t1.plus(2, ChronoUnit.HOURS);
        LocalTime t3 = t1.minusMinutes(10);

        System.out.println(t1);
        System.out.println(t2);
        System.out.println(t3);
    }
}

使用以下命令保存并执行代码:

javac DateTimeExample.java && java DateTimeExample

我们将看到以下输出:

05:32:44
07:32:44
05:22:44

创建 LocalDateTime 实例

LocalDateTime 类是 LocalDateLocalTime 类的组合。一个 LocalDateTime 实例包含日期组件和时间组件。

import java.time.LocalDateTime;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDateTime currDateTime = LocalDateTime.now();
        LocalDateTime dt1 = LocalDateTime.of(2020, 8, 13, 5, 32);
        LocalDateTime dt2 = LocalDateTime.parse("2020-08-13T05:32");

        System.out.println(currDateTime);
        System.out.println(dt1);
        System.out.println(dt2);
    }
}

使用以下命令保存并执行代码:

javac DateTimeExample.java && java DateTimeExample

我们将看到以下输出:

2021-08-13T17:46:48.837697
2020-08-13T05:32
2020-08-13T05:32

处理时区

上述讨论的类不支持时区。ZonedDateTime 类提供了这一功能。我们可以使用 ZoneId 类来标识不同的时区。

import java.time.ZonedDateTime;
import java.time.ZoneId;

public class DateTimeExample {
    public static void main(String[] args) {
        ZonedDateTime zdt = ZonedDateTime.now();
        ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo");
        ZonedDateTime zdtT = ZonedDateTime.now(zoneTokyo);
        ZoneId zoneLondon = ZoneId.of("Europe/London");
        ZonedDateTime zdtL = ZonedDateTime.now(zoneLondon);

        System.out.println(zdt);
        System.out.println(zdtT);
        System.out.println(zdtL);
    }
}

使用以下命令保存并执行代码:

javac DateTimeExample.java && java DateTimeExample

我们将看到以下输出:

2021-08-13T18:09:25.352237+05:30[Asia/Calcutta]
2021-08-13T21:39:25.356244+09:00[Asia/Tokyo]
2021-08-13T13:09:25.357316+01:00[Europe/London]

格式化日期

Java 8 提供了 format() 函数,用于将日期格式化为特定模式的字符串。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();
        String dateStr1 = dateTime.format(DateTimeFormatter.ISO_WEEK_DATE);
        String dateStr2 = dateTime.format(DateTimeFormatter.BASIC_ISO_DATE);
        String dateStr3 = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        String dateStr4 = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm:ss"));

        System.out.println(dateStr1);
        System.out.println(dateStr2);
        System.out.println(dateStr3);
        System.out.println(dateStr4);
    }
}

使用以下命令保存并执行代码:

javac DateTimeExample.java && java DateTimeExample

我们将看到以下输出:

2021-W32-5
20210813
2021-08-13T18:16:57.675704
13/08/2021 06:16:57

总结

在本实验中,我们学习了如何使用 Java 8 的日期和时间 API 来操作日期和时间。我们学习了如何创建 LocalDateLocalTimeLocalDateTime 类的实例,使用 plus()minus() 方法操作它们,并使用 getter 方法从中获取信息。此外,我们还学习了如何使用 ZonedDateTime 类处理时区,以及如何使用 DateTimeFormatter 类格式化日期。

您可能感兴趣的其他 Java 教程