Java 8 日期时间 API

Posted 走在修行的大街上

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 8 日期时间 API相关的知识,希望对你有一定的参考价值。

Java 8 日期时间 API
Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。

在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:

  • 非线程安全 ? java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。

  • 设计很差 ? Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。

  • 时区处理麻烦 ? 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。

Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:

  • Local(本地) ? 简化了日期时间的处理,没有时区的问题。

  • Zoned(时区) ? 通过制定的时区处理日期时间。

新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.ChronoField;

public class TestLocalDate {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2018, 12, 2);
        int year = date.getYear();
        System.out.println(year);

        Month month = date.getMonth();
        System.out.println(month);

        int day = date.getDayOfMonth();
        System.out.println(day);

        DayOfWeek dow = date.getDayOfWeek();
        System.out.println(dow);

        int len = date.lengthOfMonth();
        System.out.println(len);

        boolean leap = date.isLeapYear();
        System.out.println(leap);

        LocalDate today = LocalDate.now();
        System.out.println(today);

        int year1 = date.get(ChronoField.YEAR);
        int month1 = date.get(ChronoField.MONTH_OF_YEAR);
        int day1 = date.get(ChronoField.DAY_OF_MONTH);
        System.out.println(year1 + "-" + month1 + "-" + day1);
    }
}

点击查看结果

2018
DECEMBER
2
SUNDAY
31
false
2018-12-02
2018-12-2

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;

public class TestLocalDateTime {
    public static void main(String[] args) {
        // 2014-03-18T13:45:20
        LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);
        LocalDate date = LocalDate.of(2018, 3, 18);
        LocalTime time = LocalTime.of(13, 45, 20);
        LocalDateTime dt2 = LocalDateTime.of(date, time);
        LocalDateTime dt3 = date.atTime(13, 45, 20);
        LocalDateTime dt4 = date.atTime(time);
        LocalDateTime dt5 = time.atDate(date);
        System.out.println("dt1:" + dt1);
        System.out.println("dt2:" + dt2);
        System.out.println("dt3:" + dt3);
        System.out.println("dt4:" + dt4);
        System.out.println("dt5:" + dt5);

        LocalDate date1 = dt1.toLocalDate();
        LocalTime time1 = dt1.toLocalTime();
        System.out.println("date1:" + date1);
        System.out.println("time1:" + time1);
    }
}

点击查看结果

dt1:2014-03-18T13:45:20
dt2:2018-03-18T13:45:20
dt3:2018-03-18T13:45:20
dt4:2018-03-18T13:45:20
dt5:2018-03-18T13:45:20
date1:2014-03-18
time1:13:45:20

import java.time.LocalDate;
import java.time.LocalTime;

public class TestLocalTime {
    public static void main(String[] args) {
        LocalTime time = LocalTime.of(13, 45, 20);
        int hour = time.getHour();
        int minute = time.getMinute();
        int second = time.getSecond();
        System.out.println(hour + ":" + minute + ":" + second);

        LocalDate date1 = LocalDate.parse("2014-03-18");
        LocalTime time1 = LocalTime.parse("13:45:20");
        System.out.println(date1);
        System.out.println(time1);
    }
}

点击查看结果

13:45:20
2014-03-18
13:45:20

参考链接:

以上是关于Java 8 日期时间 API的主要内容,如果未能解决你的问题,请参考以下文章

Java 8的日期和时间API

转Java 8新特性:新的时间和日期API

如何从 Java 8 Date API 中的回历日期中减去回历年份

Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析

计算机程序的思维逻辑 (95) - Java 8的日期和时间API

Java 8 的新 Java 日期时间 API 是不是负责 DST?