主頁 >  其他 > JDK8日期API

JDK8日期API

2021-02-20 10:44:11 其他

文章目錄

    • 1、為什么會出現新的日期類 API ?
    • 2、Date-Time API 中的基本類使用
      • 常用類的概述與功能介紹
      • now 方法在日期/時間類的使用
      • of 方法在日期/時間類的應用
      • 為 LocalDateTime 添加時區資訊(拓展)
      • Month 列舉類的使用
    • 3、根據現有實體創建曰期與時間物件
      • plus 方法在 LocalDate 與 LocalTime 中的使用
      • plus 和 minus 方法的應用
      • with 方法在 LocalDateTime 類的應用
    • 4、調節器 TemporalAdjuster 與查詢 TemporalQuery
      • DayOfWeek 的使用
      • 自定義 TemporalAdjuster 調節器
      • TemporalQuery 的應用
    • 5、java.util.Date 與 java.time.LocalDate 的轉換
      • 使用 Instant 類將 java.util.Date 轉換為 java.time.LocalDate
      • java.sql.Date 類中的轉換方法使用
      • java.sql.Timestamp 類中的轉換方法使用
      • 將 java.util.Date 類轉換為 java.time.LocalDate 類的第二種方法
      • 將 java.util.Calendar 類轉換為 java.time.ZonedDateTime 類
      • 將 java.util.Calendar 類轉換為 java.time.LocalDateTime 類
    • 6、日期的決議與格式化 DateTimeFormatter
      • LocalDate 類定義的 parse 和 format 方法
      • 對日期決議格式化
      • 自定義格式化格式

前言:
本篇文章搬運于 B站 -> 黑馬程式員 -> Java基礎教程2020新版JDK8日期API決議
感謝黑馬程式員的良心教育,祝黑馬程式員越來越好!

1、為什么會出現新的日期類 API ?

在 Java 面世之初,標準庫中就引入了兩種用于處理日期和時間的類,分別是 java.util.Datejava.util.Calendar,但是由于很多問題,很多方法都已經棄用,在 JavaSE 8 中引入 java.time 包解決了長久以來存在的諸多弊端,java.time 包基于 Joda-Time 庫構件,是一種免費的開源解決方法,多年來一直作為處理 Java 日期和時間的事實標準,Java 原本自帶的 java.util.Datejava.util.Calendar 類,實際上這兩種類有 執行緒不安全 的風險,

問題1:對于日期的計算困難問題

  • 毫秒值與日期直接轉換比較繁瑣,其次通過毫秒值來計算時間的差額步驟較多,

問題2:執行緒不安全問題

  • SimpleDateFormat 類是執行緒不安全的,在多執行緒的情況下,全域共享一個,
  • SimpleDateFormat 類中的 Calendar 物件有可能會出現例外,

問題3:使用規范問題

  • 另外的一個問題就是在 java.util.Datejava.util.Calendar 類之前,列舉型別(ENUM)還沒有出現,所以在欄位中使用整數常量導致整數常量都是可變的,而不是執行緒安全的,為了處理實際開發中遇到的問題,標準庫隨后引入了 java.sql.Date 作為 java.util.Date 的子類,但是還是沒能徹底解決問題,

2、Date-Time API 中的基本類使用

常用類的概述與功能介紹

Instant 類

  • Instant 類對時間軸上的單一瞬時點建模,可以用于記錄應用程式中的事件時間戳,

Duration 類

  • Duration 類表示秒或納秒時間間隔,適合處理較短的時間,需要更高的精確性,

Period 類

  • Period 類表示一段時間的年、月、日,

LocalDate 類

  • LocalDate 類是一個不可變的日期時間物件,表示日期,通常被視為年月日,

LocalTime 類

  • LocalTime 類是一個不可變的日期時間物件,代表一個時間,通常被看作是時分秒,時間表示為納秒精度,

LocalDateTime 類

  • LocalDateTime 類是一個不可變的日期時間物件,代表日期時間,通常被視為年月日時分秒,

ZonedDateTime 類

  • ZonedDateTime 類是具有時區的日期時間的不可變表示,此類存盤所有日期和時間欄位,精度為納秒,時區為區域偏移量,用于處理模糊的本地日期時間,

now 方法在日期/時間類的使用

Date-Time API 中的所有類均生成不可變實體,它們是執行緒安全的,并且這些類不提供公共建構式,也就是說沒辦法通過 new 的方式直接創建,需要采用工廠方法加以實體化,

now 方法可以根據當前日期或時間創建實體,

public static void main(String[] args) {
	Instant instant = Instant.now();
	LocalDate localDate = LocalDate.now();
	LocalTime localTime = LocalTime.now();
	LocalDateTime localDateTime = LocalDateTime.now();
	ZonedDateTime zonedDateTime = ZonedDateTime.now();
}

不僅僅是剛才提供的幾個類可以使用 now 方法,Java8 的 Time 包中還提供了其他的幾個類可以更精準的獲取某些資訊,

  • Year 類(表示年)
  • YearMonth 類(表示年月)
  • MonthDay 類(表示月日)
public static void main(String[] args) {
	Year year = Year.now();
	YearMonth yearMonth = YearMonth.now();
	MonthDay monthDay = MonthDay.now();
}

of 方法在日期/時間類的應用

of 方法可以根據給定的引數生成對應的日期/時間物件,基本上每個基本類都有 of 方法用于生成的對應的物件,而且多載形式多變,可以根據不同的引數生成對應的資料,

public static void main(String[] args) {
    // 初始化一個2018年8月8日的LocalDate物件
    LocalDate localDate = LocalDate.of(2018, 8, 8);
    System.out.println("localDate : " + localDate);

    // 初始化晚上8點0分0秒的LocalDate物件,如果是晚上的時間,需要加上12個小時
    LocalTime localTime = LocalTime.of(20, 0, 0, 0);
    System.out.println("localTime : " + localTime);

    // 初始化2018年8月8日下午8點0分的LocalDateTime物件
    LocalDateTime localDateTime = LocalDateTime.of(2018,8,8,20,0);
    System.out.println("localDateTime : " + localDateTime);

    // LocalDateTime的of方法的特殊使用
    LocalDateTime localDateTime1 = LocalDateTime.of(localDate, localTime);
    System.out.println("localDateTime1 : " + localDateTime1);
}

為 LocalDateTime 添加時區資訊(拓展)

ZonedDateTime 這個物件里面封裝的不僅有時間日期,并且還有偏移量 + 時區,那么時區如何在 Java 中獲取呢,通過提供的一個類 ZoneId 的 getAvailableZoneIds 方法可以獲取到一個 set 集合,集合中封裝了 608 個時區,同樣也提供了獲取當前系統默認的時區的方式 systemDefault() 方法,

public static void main(String[] args) {
    // 獲取所有的時區資訊
    Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
    for (String availableZoneId : availableZoneIds) {
        System.out.println(availableZoneId);
    }
    // 獲取當前系統默認的時區資訊
    ZoneId zoneId = ZoneId.systemDefault();
    System.out.println(zoneId);
}

我們可以通過給 LocalDateTime 添加時區資訊來查看到不同時區的時間,比如說 LocalDateTime 中當前封裝的是上海時間,那么想知道在此時此刻,紐約的時間是什么,就可以將紐約的時區 Id 添加進去,就可以查看到了,方式如下:

  • 封裝時間 LocalDateTime 并添加時區資訊,
  • 更改時區資訊查看對應時間,
public static void main(String[] args) {
    // 初始化LocalDateTime物件
    LocalDateTime localDateTime = LocalDateTime.now();
    // 添加時區資訊到物件中,使用atZone()方法
    ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));
    System.out.println("Asia/Shanghai -> 當前時間 : " + zonedDateTime);
    // 更改時區查看其他時區的當前時間,通過方法
    ZonedDateTime zonedDateTime1 = zonedDateTime.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));
    System.out.println("Asia/Tokyo -> 當前時間 : " + zonedDateTime1);
}

Month 列舉類的使用

java.time 包中引入了 Month 的列舉,Month 中包含標準日歷中的 12 個月份的常量(從 JANURAY 到 DECEMEBER)也提供了一些方便的方法供我們使用,

推薦在初始化 LocalDate 和 LocalDateTime 物件的時候,月份的引數使用列舉的方式傳入,這樣更簡單易懂而且不易出錯,因為如果是老的思維,Calendar 傳入 0 的話,那么會出現例外,

public static void main(String[] args) {
    // 初始化LocalDateTime物件,月份使用列舉
    LocalDateTime localDateTime = LocalDateTime.of(2018,Month.JUNE,15,11,11,11);
    System.out.println("localDateTime : " + localDateTime);

    // of方法可以根據傳入的數字回傳對應的月份
    Month month = Month.of(12);
    System.out.println("month : " + month);
}

3、根據現有實體創建曰期與時間物件

想要修改某個日期/時間物件的現有實體時,我們可以使用 plusminus 方法來完成操作,Java8 中日期時間相關的 API 中的所有實體都是不可改變的,一旦創建 LocalDate,LocalTime,LocalDateTime 就無法修改他們(類似于 String),這對于執行緒安全非常有利,

plus 方法在 LocalDate 與 LocalTime 中的使用

LocalDate 中定義了多種對日期進行增減操作的方法:

  • LocalDate plusDays(long days) :增加天數,
  • LocalDate plusWeeks(long weeks) :增加周數,
  • LocalDate plusMonths(long months) :增加月數,
  • LocalDate plusYears(long years) :增加年數,
public static void main(String[] args) {
   // 初始化LocalDate物件
    LocalDate localDate = LocalDate.now();
    System.out.println("當前日期 : " + localDate);
    // 計算當前日期4天后的日期
    LocalDate localDate1 = localDate.plusDays(4);
    System.out.println("當前日期4天后的日期 : " + localDate1);
    // 計算當前日期3周后的日期
    LocalDate localDate2 = localDate.plusWeeks(3);
    System.out.println("當前日期3周后的日期 : " + localDate2);
    // 計算當前日期5個月后的日期
    LocalDate localDate3 = localDate.plusMonths(5);
    System.out.println("當前日期5個月后的日期 : " + localDate3);
    // 計算當前日期2年后的日期
    LocalDate localDate4 = localDate.plusYears(2);
    System.out.println("當前日期2年后的日期 : " + localDate4);
}

LocalTime 中定義了多種對日期進行增減操作的方法:

  • LocalTime plusNanos(long nanos) :增加納秒,
  • LocalTime plusSeconds(long seconds) :增加秒,
  • LocalTime plusMinutes(long minutes) :增加分鐘,
  • LocalTime plusHougs(long hours) :增加小時,

上面的示例都是使用 plusXx 方法進行演示的,實際上也有對應的減少方法,以 minus 開頭的方法對應的即為減少,實際上 minus 方法呼叫的也是 plus 方法,只不過傳入的引數是負數,

plus 和 minus 方法的應用

剛才學習到的 plusXx 相關的方法都是添加了數值到具體的某一項上,根據觀察還有兩個單獨的plus方法,接下來我們來學習這兩個單獨的plus方法,

  • plus(TemporaAmount amountToAdd) :TemporaAmount 是一個介面,當介面作為方法的引數的時候,實際上傳入的是介面的實作類物件,它的實作類有 Duration 和 Period 等,
public static void main(String[] args) {
    // 今天程式員小張查看自己的車輛保險記錄的時候看到還有2年3月8天就到期了,計算到期的日期是什么時候?
    // 方法1
    LocalDate dueDate = LocalDate.now().plusYears(2).plusMonths(3).plusDays(8);
    System.out.println("到期日期 : " + dueDate);

    // 方法2
    Period period = Period.of(2,3,8);
    LocalDate dueDate1 = LocalDate.now().plus(period);
    System.out.println("到期日期 : " + dueDate1);
}
  • plus(long 1,TemporaUnit unit) :在實際開發程序中,可能還會更精準的去操作日期或者說增加一些特殊的時間,比如說1個世紀,1個半天,1千年,10年等,Java8 提供了這些日期的表示方式而不需要去單獨進行計算了,TemporaUnit 是一個介面,通過查看體系介面發現,可以使用子類 ChronoUnit 來表示,ChronoUnit 封裝了很多時間段供我們使用,
Enum Constant描述
CENTURIES代表一個世紀概念的單位,
DAYS代表一天概念的單位,
DECADES代表十年概念的單位,
ERAS代表一個時代概念的單位,
FOREVER代表永恒概念的人工單位,
HALF_DAYS代表AM / PM中使用的半天概念的單位,
HOURS表示一小時概念的單位,
MICROS表示微秒概念的單位,
MILLENNIA代表千年概念的單位,
MILLIS表示毫秒概念的單位,
MINUTES表示一分鐘概念的單位,
MONTHS代表一個月概念的單位,
NANOS代表納秒概念的單位,是支持的最小時間單位,
SECONDS表示第二個概念的單位,
WEEKS表示一周概念的單位,
YEARS代表一年概念的單位,
public static void main(String[] args) {
    // 結婚10年稱為錫婚,2020年2月2日11點11分11秒稱為對稱日,很多情侶準備在那天結婚,如果在那天結婚了,那么錫婚會發生在什么時候?
    LocalDateTime marryTime = LocalDateTime.of(2020,Month.FEBRUARY,2,11,11,11);
    LocalDateTime dateTime = marryTime.plus(1, ChronoUnit.DECADES);
    System.out.println("錫婚發生時間 : " + dateTime);
}

with 方法在 LocalDateTime 類的應用

如果不需要對日期進行加減而是要直接修改日期的話,那么可以使用 with 方法,with 方法提供了很多種修改時間的方式,

  • Loca1DateTime withNano(int i) :修改納秒,
  • LocalDateTime withSecond(int i) :修改秒,
  • LocalDateTime withMinute(int i) :修改分鐘,
  • LocalDateTime withHour(int i) :修改小時,
  • LocalDateTime withDayOfMonth(int i) :修改日,
  • LocalDateTime withMonth(int i) :修改月,
  • LocalDateTime withYear(int i) :修改年,
public static void main(String[] args) {
   LocalDateTime localDateTime = LocalDateTime.of(2020,Month.FEBRUARY,18,11,11,11);
    System.out.println("修改前:" + localDateTime);
    LocalDateTime localDateTime1 = localDateTime.withDayOfMonth(8);
    System.out.println("修改后:" + localDateTime1);
}
  • with(TemporalField field,long newValue) :TemporalField 是一個介面,通過查看體系結構,可以使用它的子類 ChronoField,ChronoField中 封裝了一些日期時間中的組成部分,可以直接選擇之后傳入第二個引數進行修改,
    例:with(ChronoField.DAY_OF_MONTH,1) 就是將日期中的月份中的天數改為1,
    例:with(ChronoField. YEAR,2021) 就是將日期中的年份改為2021,
public static void main(String[] args) {
    LocalDateTime localDateTime = LocalDateTime.of(2020,Month.FEBRUARY,18,11,11,11);
    System.out.println("修改前:" + localDateTime);
    LocalDateTime localDateTime1 = localDateTime.with(ChronoField.DAY_OF_MONTH,8);
    System.out.println("修改后:" + localDateTime1);
}

4、調節器 TemporalAdjuster 與查詢 TemporalQuery

在上一節學習的 with 方法中學習了可以通過 with 方法修改日期時間物件中封裝的資料,但是有一些時候可能會做一些復雜的操作,比如說將時間調整到下個周的周日,下一個作業日,或者本月中的某一天,這個時候可以使用調節器 TemporalAdjuster 來更方便的處理日期,

Java 8 提供了一個叫做 TemporalAdjusters 的類可以給我們提供一些常用的方法,方法如下:

  • static TemporalAdjuster firstDayOfMonth() :本月的第一天,
  • static TemporalAdjuster firstDayOfNextMonth() :下個月的第一天,
  • static TemporalAdjuster firstDayOfYear() :本年的第一天,
  • static TemporalAdjuster firstDayOfNextYear() :下一年的第一天,
  • static TemporaAdjuste lastInMonth(DayOfweek dayOfweek) :當月的最后一個周x(通過引數確定),
  • static TemporaAdjuster next(DayOfWeek dayOfweek) :下一個周x(通過引數確定),
  • static TemporaAdjuster previous(DayOfweek dayOfweek) :上一個周x(通過引數確定),
public static void main(String[] args) {
    LocalDate localDate = LocalDate.now();
    // 修改日期為本月的第一天
    LocalDate localDate1 = localDate.with(TemporalAdjusters.firstDayOfMonth());
    System.out.println("本月的第一天的日期:" + localDate1);
    // 修改日期為本月的最后一天
    LocalDate localDate2 = localDate.with(TemporalAdjusters.lastDayOfMonth());
    System.out.println("本月的最后一天的日期:" + localDate2);
    // 修改日期為下個月的第一天
    LocalDate localDate3 = localDate.with(TemporalAdjusters.firstDayOfNextMonth());
    System.out.println("下個月的第一天的日期:" + localDate3);
    // 修改日期為下一年的第一天
    LocalDate localDate4 = localDate.with(TemporalAdjusters.firstDayOfNextYear());
    System.out.println("下一年的第一天的日期:" + localDate4);
}

DayOfWeek 的使用

DayOfWeek 是一周中星期幾的列舉類其中封裝了從周一到周日,

public static void main(String[] args) {
    LocalDate localDate = LocalDate.now();
    // 修改日期為下一個周日
    LocalDate localDate1 = localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
    System.out.println("下一個周日的日期:" + localDate1);
    // 修改日期為上一個周三
    LocalDate localDate2 = localDate.with(TemporalAdjusters.previous(DayOfWeek.WEDNESDAY));
    System.out.println("上一個周三的日期:" + localDate2);
}

自定義 TemporalAdjuster 調節器

通過 Java 8 本身提供的 TemporalAdjusters 中的方法可以完成一些常用的操作,如果要自定義日期時間的更改邏輯,可以通過實作 TemporalAdjuster 類介面中的方式來完成,

  1. 創建類實作 TemporalAdjuster 介面,
  2. 實作 TemporalAdjuster 中的 adjustInto 方法,傳入一個日期時間物件,完成邏輯之后回傳日期時間物件,
  3. 通過 with 方法傳入自定義調節器物件完成更改,

例:假如員工一個月中領取工資,發薪日是每個月的15號,如果發薪日是周末,則調整為周五,

package com.y2.test1.time;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class PayDayAdjuster implements TemporalAdjuster {
    @Override
    public Temporal adjustInto(Temporal temporal) {
        // 1.Temporal是日期時間類物件的父介面,實際上可以理解為傳入的就是LocalDate或者是LocalTime等物件,需要將temporal轉換為LocalDate物件
        LocalDate payDate = LocalDate.from(temporal);
        // 2.判斷傳入的日期是否為本月15日,如果不是,則修改為15日
        int day;
        if (payDate.getDayOfMonth() != 15) {
            day = 15;
        }else {
            day = payDate.getDayOfMonth();
        }
        // 3.判斷傳入日期是否為周末,如果為周末,則將日期修改為上一個周五
        LocalDate realPayDate = payDate.withDayOfMonth(day);
        if (realPayDate.getDayOfWeek() == DayOfWeek.SATURDAY || realPayDate.getDayOfWeek() == DayOfWeek.SUNDAY) {
            realPayDate = realPayDate.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
        }
        return realPayDate;
    }
}
public static void main(String[] args) {
    LocalDate payDate = LocalDate.of(2021,5,18);
    LocalDate realPayDate = LocalDate.from(new PayDayAdjuster().adjustInto(payDate));
    System.out.println("實際發薪日:" + realPayDate);
}

TemporalQuery 的應用

學習的時態類物件(LocalDate,LocalTime)都有一個方法叫做 query,可以針對日期進行查詢,

R query(TemporalQuery query),這個方法是一個泛型方法,回傳的資料就是傳入的泛型類的型別,TemporalQuery 是一個泛型介面,里面有一個抽象方法是 R queryFrom(TemporalAccessor temporal),TemporalAccessor 是 Temporal 的父介面,實際上也就是 LocalDate 和 LocalDateTime 相關類的頂級父介面,這個 queryFrom 的方法的實作邏輯就是傳入一個日期/時間物件通過自定義邏輯回傳資料,

如果要計劃日期距離某一個特定天數差距多少天,可以自定義類實作 TemporalQuery 介面并且作為引數傳入到 query 方法中,

例:計算當前時間距離下一個勞動節還有多少天?

package com.y2.test1.time;

import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalQuery;

public class UtilDayQuery implements TemporalQuery<Long> {
    @Override
    public Long queryFrom(TemporalAccessor temporal) {
        // 1.TemporalAccessor是LocalDate和LocalDatetime的頂級父介面,相當于LocalDate就是這個介面的實作類,將temporal轉換為LocalDate進行使用
        LocalDate now = LocalDate.from(temporal);
        // 2.初始化本年的勞動節日期
        LocalDate laborDate = LocalDate.of(now.getYear(), Month.MAY, 1);
        // 3.判斷當前時間是否已經超過了當年的勞動節,如果超過了當年的勞動節,則laborDay+1年
        if (now.isAfter(laborDate)) {
            laborDate = laborDate.plusYears(1);
        }
        // 4.通過
        long days = ChronoUnit.DAYS.between(now, laborDate);
        return days;
    }
}
public static void main(String[] args) {
    LocalDate now = LocalDate.of(2021,5,2);
    Long days = new UtilDayQuery().queryFrom(now);
    System.out.println("距離下一個勞動節還有" + days + "天");
    LocalDate laborDate = now.plusDays(days);
    System.out.println("下一個勞動節的日期:" + laborDate);
}

5、java.util.Date 與 java.time.LocalDate 的轉換

Java 8 中的 java.time 包中并沒有提供太多的內置方式來轉換 java.util 包中用預處理標準曰期和時間的類,我們可以使用 Instant 類作為中介,也可以使用 java.sql.Date 和 java.sql.Timestamp 類提供的方法進行轉換,

使用 Instant 類將 java.util.Date 轉換為 java.time.LocalDate

java.time 包中并沒有提供很多的方式來進行直接轉換,但是給之前的 Date 類,Calendar 類在 Java1.8 都提供了一個新的方法, 叫做 toInstant,可以將當前物件轉換為 Instant 物件,通過給 Instant 添加時區資訊之后就可以轉換為 LocalDate物件,

public static void main(String[] args) {
    // 初始化Date物件
    Date date = new Date();
    // 1.將Date物件轉換為Instant物件
    Instant instant = date.toInstant();
    // 2.Date類包含日期和時間資訊,但是并不提供時區資訊,和Instant類一樣,通過Instant類的atZone方法添加時區資訊進行轉換
    ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
    // 3.將ZonedDateTime通過toLocalDate方法轉換為LocalDate物件
    LocalDate localDate = zonedDateTime.toLocalDate();
    System.out.println("date : " + date);
    System.out.println("localDate : " + localDate);
}

java.sql.Date 類中的轉換方法使用

java.sql.Date 類中提供直接轉換為 LocalDate 的方法 toLocalDate

public static void main(String[] args) {
    // 初始化java.sql.Date物件
    Date date = new Date(System.currentTimeMillis());
    LocalDate localDate = date.toLocalDate();
    System.out.println("date : " + date);
    System.out.println("localDate : " + localDate);
}

java.sql.Timestamp 類中的轉換方法使用

TimeStamp 是時間戳物件,通過傳入一個毫秒值物件進行初始化,

public static void main(String[] args) {
    // 初始化java.sql.Timestamp物件
    Timestamp timestamp = new Timestamp(System.currentTimeMillis());
    LocalDateTime localDateTime = timestamp.toLocalDateTime();
    System.out.println("timestamp : " + timestamp);
    System.out.println("localDateTime : " + localDateTime);
}

將 java.util.Date 類轉換為 java.time.LocalDate 類的第二種方法

java.sql.Date 類提供了轉換為 LocalDate 的方法,那么可以將 java.util.Date 先轉換為 java.sql.Date,

通過 java.sql.Date 的構造方法直接傳入一個毫秒值可以構造一個 java.sql.Date 物件,毫秒值可以通過 java.util.Date 物件的 getTime 方法獲取到,

public static void main(String[] args) {
    Date date = new Date();
    java.sql.Date date1 = new java.sql.Date(date.getTime());
    LocalDate localDate = date1.toLocalDate();
    System.out.println("java.util.date : " + date);
    System.out.println("java.sql.date : " + date1);
    System.out.println("localDate : " + localDate);
}

將 java.util.Calendar 類轉換為 java.time.ZonedDateTime 類

Calendar 物件自 Java1.1 開始提供了一個方法獲取時區物件的方法 getTimeZone,要將 Calendar 物件轉換為 ZonedDateTime 需要先獲取到時區物件,從 Java 1.8 開始 TimeZone 類提供了一個方法可以獲取到 ZonedId,獲取到 ZoneId 之后就可以初始化 ZonedDateTime 物件了,ZonedDateTime 類有一個 ofInstant 方法,可以將一個 Instant 物件和 ZonedId 物件作為引數傳入構造一個 ZonedDateTime 物件,

public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    TimeZone timeZone = calendar.getTimeZone();
    ZoneId zoneId = timeZone.toZoneId();
    ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(calendar.toInstant(), zoneId);
    System.out.println("calendar : " + calendar);
    System.out.println("zonedDateTime : " + zonedDateTime);
}

將 java.util.Calendar 類轉換為 java.time.LocalDateTime 類

Calendar 物件可以獲取到年月日時分秒的資訊,這些資訊可以作為 LocalDateTime 構造方法的引數,

public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    int hour = calendar.get(Calendar.HOUR);
    int minute = calendar.get(Calendar.MINUTE);
    int second = calendar.get(Calendar.SECOND);
    LocalDateTime localDateTime = LocalDateTime.of(year, month + 1, day, hour, minute, second);
    System.out.println("calendar : " + calendar);
    System.out.println("localDateTime : " + localDateTime);
}

6、日期的決議與格式化 DateTimeFormatter

SimpleDateFormat 類在剛開始的講過了是執行緒不安全的,所以 Java8 提供了新的格式化類 DateTimeFormatter,

DateTimeFormatter 類提供了大量預定義格式化器,包括常量(如 ISO_LOCAL_DATE),模式字母(如 yyyy-MM-dd)以及本地化樣式,

與 SimpleDateFormat 不同的是,新版本的日期/時間 API 的格式化與決議不需要在創建轉換器物件再進行轉換了,通過時間日期物件的 parse/format 方法可以直接進行轉換,

LocalDate 類定義的 parse 和 format 方法

public static void main(String[] args) {
    // 格式化
    LocalDateTime now = LocalDateTime.now();
    String s1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
    String s2 = now.format(DateTimeFormatter.ISO_DATE);
    System.out.println("now : " + now);
    System.out.println("ISO_DATE_TIME格式化:" + s1);
    System.out.println("ISO_DATE格式化:" + s2);

    // 決議
    LocalDateTime localDateTime = LocalDateTime.parse(s1);
    LocalDate localDate = LocalDate.parse(s2);
    System.out.println("localDateTime : " + localDateTime);
    System.out.println("localDate : " + localDate);
}

對日期決議格式化

通過 DateTimeFormatter 的 ofLocalizedDate 的方法也可以調整格式化的方式,

此方法需要傳入一個 FormatStyle 類物件,查看后發現 FormatStyle 物件是一個列舉類,其中有幾種方式如下:

  • Full:全顯示(年月日 + 星期)
  • Long:全顯示(年月日)
  • Medium:縮略顯示(沒有年月日漢字)
  • SHORT:精簡顯示(精簡年 + 月日)
public static void main(String[] args) {
    // 格式化
    LocalDateTime now = LocalDateTime.now();
    String r1 = now.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL));
    String r2 = now.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG));
    String r3 = now.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM));
    String r4 = now.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT));
    System.out.println("FULL : " + r1);
    System.out.println("LONG : " + r2);
    System.out.println("MEDIUM : " + r3);
    System.out.println("SHORT : " + r4);
}

注意此種方式在不同時區的顯示方式不一樣,在其他時區不會顯示中文,會根據當前系統的默認時區來進行區別顯示,

自定義格式化格式

除了系統的自帶的方式之外,也可以通過 DateTimeFormatter 類提供的 ofPattern 方式創建自定時格式化器,格式化的寫法與之前使用的 SimpleDateFormat 相同,

public static void main(String[] args) {
    // 格式化
    LocalDateTime now = LocalDateTime.now();
    String s = now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss:SSS"));
    System.out.println("格式化后:" + s);
}

歡迎觀看,感謝支持!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/261330.html

標籤:其他

上一篇:資訊搜集的意義

下一篇:Kotlin關鍵字運算子說明及使用示例與解釋

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more