Java 8 日期和时间 API

原文:https://www.studytonight.com/java-8/java-8-date-and-time-api

Java 在 Java 8 版本中添加了一个新的日期和时间 API,它由几个类、接口和枚举组成,用于处理日期和时间。

在 Java 8 之前,有一个java.util.Date类来创建和处理日期和时间,它有一些限制,比如不是线程安全的、 设计不佳难以处理时区。

新的日期和时间 API 基于国际标准化组织日历系统,所有的类都是不可变的和线程安全的。

java.time 包的类代表主要的日期时间概念,包括瞬间、持续时间、日期、时间、时区和周期。

Java 日期时间 API 类

新的 java.time 包包括下面列出的各种类和枚举。

|

班级

|

描述

| | 时钟 | 使用时区提供当前即时、日期和时间的时钟。 | | 持续时间 | 基于时间的时间量,如“34.5 秒”。 | | 瞬间 | 时间线上的瞬间点。 | | 局部日期 | 在 ISO-8601 日历系统中没有时区的日期,如 2007-12-03。 | | LocalDateTime | 在 ISO-8601 日历系统中没有时区的日期时间,例如 2007-12-03T10:15:30。 | | LocalTime(本地时间) | 在 ISO-8601 日历系统中没有时区的时间,如 10:15:30。 | | 蒙特达伊 | ISO-8601 日历系统中的月日,如- 12-03。 | | 偏移日期时间 | 在 ISO-8601 日历系统中,从世界协调时/格林威治时间偏移的日期时间,如 2007-12-03T10:15:30+01:00。 | | 偏移时间 | 在 ISO-8601 日历系统中,从世界协调时/格林威治时间偏移的时间,如 10:15:30+01:00。 | | 时期 | ISO-8601 日历系统中基于日期的时间量,例如“2 年 3 个月 4 天”。 | | 年 | ISO-8601 日历系统中的一年,如 2007 年。 | | 年月 | ISO-8601 日历系统中的一年一月,如 2007-12。 | | ZonedDateTime | 在 ISO-8601 日历系统中带有时区的日期时间,例如 2007-12-03T10:15:30+01:00 欧洲/巴黎。 | | ZoneId | 时区标识,如欧洲/巴黎。 | | ZoneOffset(区域偏移) | 与格林威治时间/世界协调时的时区偏移量,如+02:00。 |

Java 8 日期时间 API 枚举

以下是存在于 java.time 包中的枚举。

| 列举型别 | 描述 | | 星期几 | 一周中的某一天,如“星期二”。 | | 月 | 一年中的一个月,如“六月”。 |

示例:本地日期类

该类在 java.time 包中提供。它表示在 ISO-8601 日历系统中没有时区的日期,例如 2007-12-03。

LocalDate 类是一个不可变的日期时间对象,用于创建地区日期。见下面的例子。

public class STDemo {
    public static void main(String[] args){

        LocalDate date = LocalDate.parse("2012-12-10");
        System.out.println(date);    
    }
}

2012-12-10

示例:本地日期时间类

这个类用于创建一个有时间但没有时区的日期。它表示在 ISO-8601 日历系统中没有时区的日期时间,例如 2010-10-03T10:10:50。

LocalDateTime类是一个不可变的日期时间对象,代表一个日期时间。我们可以用它来表示有时间的日期。例如,值“2007 年 10 月 2 日 13:45.30.123456789”可以存储在LocalDateTime中。

import java.time.LocalDateTime;

public class STDemo {
    public static void main(String[] args){

        LocalDateTime date = LocalDateTime.of(2012, 12, 10, 2, 30);
        System.out.println(date);    
    }
}

2012-12-10T02:30

示例:本地时间类

此类用于创建本地时间对象。它表示在 ISO-8601 日历系统中没有时区的时间,例如 11:10:30。

LocalTime类是表示时间的不可变日期时间对象,例如“13:45.30.123456789”的值可以存储在LocalTime中。见下面的例子。

import java.time.LocalTime;

public class STDemo {
    public static void main(String[] args){

        LocalTime time = LocalTime.of(12, 12,30);
        System.out.println(time);    
    }
}

12:12:30

示例:区域数据时间类

此类用于创建带有时区的日期时间对象。它表示在 ISO-8601 日历系统中带有时区的日期时间,例如 2017-10-03T10:10:30+05:30 亚洲/加尔各答。

ZonedDateTime类是带有时区的日期时间的不可变表示。此类存储所有日期和时间字段。例如,“亚洲/加尔各答时区 2017 年 10 月 2 日 15:40.35.123456786 +05:30”的值可以存储在ZonedDateTime中。

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

public class STDemo {
    public static void main(String[] args){

        ZonedDateTime time = ZonedDateTime.of(2015, 10, 15, 2, 10, 30, 0, ZoneId.systemDefault());
        System.out.println(time);    
    }
}

2015-10-15T02:10:30+05:30【亚洲/加尔各答】

示例:偏移日期时间类

此类用于在 ISO-8601 日历系统中创建从世界协调时/格林威治时间偏移的日期时间,例如 2017-10-03T15:10:30+01:00。

OffsetDateTime类是带有偏移量的日期时间的不可变表示。此类存储所有日期和时间字段,以及与世界协调时/格林威治时间的偏移量。例如,值“2017 年 10 月 2 日 15:42.35.123456789 +02:00”可以存储在OffsetDateTime中。

import java.time.OffsetDateTime;
public class STDemo {
    public static void main(String[] args){

        OffsetDateTime date = OffsetDateTime.parse("2017-02-03T12:30:30+01:00");
        System.out.println(date);
    }
}

2017-02-03T12:30:30+01:00

示例:偏移时间类

此类用于存储在 ISO-8601 日历系统中从世界协调时/格林威治时间偏移的时间,例如 15:10:35+01:00。

OffsetTime类是一个表示时间的不可变日期时间对象。此类存储所有时间字段以及区域偏移量。例如,值“15:40.35.123456789+02:00”可以存储在OffsetTime中。

import java.time.OffsetTime;
public class STDemo {
    public static void main(String[] args){

        OffsetTime time = OffsetTime.parse("12:30:30+01:00");
        System.out.println(time);
    }
}

12:30:30+01:00