Java 中的日期時間總結

来源:https://www.cnblogs.com/god23bin/archive/2023/09/08/datetime-in-java.html
-Advertisement-
Play Games

大家好,我是 god23bin,在日常開發中,我們經常需要處理日期和時間,日期和時間可以說是一定會用到的,現在總結下 Java 中日期與時間的基本概念與一些常用的用法。 ...


前言

大家好,我是 god23bin,在日常開發中,我們經常需要處理日期和時間,日期和時間可以說是一定會用到的,現在總結下 Java 中日期與時間的基本概念與一些常用的用法。

基本概念

  1. 日期(年月日,某一天):2023-01-05

  2. 時間(時分秒,可具體到某一天某一刻):18:00:002023-01-05 18:00:00

  3. 本地時間:平常我們說的,比如現在說明天早上七點鐘,這裡說的時間就是本地時間,在咱們中國,指的就是北京時間。但是在明天早上七點鐘,對於其他國家的人來說,他們的本地時間就不一樣了。

  4. 時區:由於世界各個國家與地區經度不同,本地時間也有所不同,所以劃分了不同的時區,目前劃分的是24個時區,咱們就位於東八區。目前需要瞭解的時區的表達方式知道兩種就可以了。

    • GMT 或者 UTC 加時區偏移量表示,例如:GMT+08:00 或者 UTC+08:00 表示東八區
    • 洲/城市 表示,例如,Asia/Shanghai,表示上海所在地的時區。不過這裡的城市名稱不是任意的城市,而是由國際標準組織規定的城市。

Java 8 之前日期時間相關的類

在 Java 8 之前,主要使用的日期和時間 API 包括:

  1. java.util.Date
  2. java.util.Calendar
  3. java.text.SimpleDateFormat

1. Date

Date 是 Java 中表示日期和時間的類,一般用於獲取當前的日期和時間,比如更新資料庫中記錄的時候,需要更新某個日期時間,那麼就直接 new Date(),這樣實例化的 Date 對象就是當前的這一時刻。

Date date = new Date();
// 可以列印當前日期時間
System.out.println(date.toString()); // 控制台輸出 Thu Jan 05 18:41:11 CST 2023

2. SimpleDateFormat

SimpleDateFormat 是 Java 中用於格式化日期和時間的類,此處所謂格式化,就是字面意思,統一格式,即它允許你將日期和時間按照指定的格式轉換成字元串,也可以將對應格式的字元串解析成日期和時間對象。

主要用法就是:

  1. 格式化日期和時間
  2. 解析字元串格式的日期和時間

format 方法-格式化日期時間,從 Date 到 String

使用 public final String format(Date date) 方法格式化日期時間。上面輸出的格式,不是我們想要的,所以需要進行日期時間的格式化。

最常用的一個格式化的模型是:yyyy-MM-dd HH:mm:ss

其中,yyyy 是年份,MM 是月份,dd 是天數,後面同理,HH:mm:ss 是時、分、秒。

// 常用的格式化
String pattern1 = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf1 = new SimpleDateFormat(pattern1);
System.out.println(sdf1.format(date3)); // 輸出 2023-01-05 18:19:50

String pattern2 = "yyyy年MM月dd日 HH時mm分ss秒";
SimpleDateFormat sdf2 = new SimpleDateFormat(pattern2);
System.out.println(sdf2.format(date3)); // 輸出 2023年01月05日 18時19分50秒

parse 方法-字元串日期時間解析,從 String 到 Date

使用 public Date parse(String source) 方法將 String 轉成 Date

String input = "2023-01-01 00:00:01";
String pattern1 = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf3 = new SimpleDateFormat(pattern1);
try {
    // 將 String 類型的日期解析成 Date 類型的日期
    Date parsed = sdf3.parse(input);
    System.out.println(parsed);
} catch (ParseException e) {
    e.printStackTrace();
}

3. Calendar

Calendar 是 Java 中用於處理日期和時間的抽象基類。它提供了一個類似於日曆的機制,允許我們進行日期和時間的計算、格式化和解析。

簡而言之,這個類主要用於日期的計算,比如你想得到此刻前一天的日期。

Calendar 是一個抽象類,不能直接實例化。所以我們需要使用 getInstance() 方法獲取 Calendar 的實例:

Calendar calendar = Calendar.getInstance();

當我們有一個 Calendar 對象後,就可以表示日期和時間了,通過設置各個欄位,如年、月、日、時、分、秒等來表示一個具體的日期和時間。

calendar.set(Calendar.YEAR, 2023);          // 設置年份為2023
calendar.set(Calendar.MONTH, Calendar.MAY); // 設置月份為5(從0開始,5表示六月)
calendar.set(Calendar.DAY_OF_MONTH, 16);    // 設置日期為16號

日期和時間的計算

Calendar允許你進行日期和時間的加減操作,例如:

calendar.add(Calendar.DAY_OF_MONTH, 7); // 增加7天

這將在當前日期的基礎上增加 7 天。

下表列出了 Java 中 Calendar 類常用的方法及其描述:

方法 描述
get(int field) 返回給定欄位的值。例如,calendar.get(Calendar.MONTH) 返回月份。
set(int field, int value) 設置給定欄位的值。例如,calendar.set(Calendar.YEAR, 2023) 設置年份為2023。
add(int field, int amount) 增加或減少給定欄位的值。例如,calendar.add(Calendar.DAY_OF_MONTH, 1) 將日期增加一天。
getTime() 返回表示此Calendar時間點的Date對象。
setTime(Date date) 使用指定的Date對象設置此Calendar的時間點。
getTimeInMillis() 返回以毫秒為單位表示此Calendar時間點的時間值。
setTimeInMillis(long millis) 使用指定的時間值設置此Calendar的時間點。
getTimeZone() 返回此Calendar使用的時區。
setTimeZone(TimeZone zone) 設置此Calendar的時區。
isLenient() 返回Calendar是否寬鬆,即是否允許非法日期。
setLenient(boolean lenient) 設置Calendar是否寬鬆。
getActualMaximum(int field) 返回給定欄位的最大允許值。例如,calendar.getActualMaximum(Calendar.DAY_OF_MONTH) 返回當前月份的最大天數。

Java 8 引入的新的日期時間相關的類

當 Java 8 引入 java.time 包時,它引入了一些新的日期和時間 API,這些 API 旨在提供更強大、更易於使用、線程安全且具有本地化支持的日期和時間處理方式。

以下是這些 API 的概述:

  1. LocalDate:表示日期,但不包含時間和時區信息。它提供了各種方法來處理日期,如創建、解析、格式化、計算日期差等。
  2. LocalTime:表示時間,但不包含日期和時區信息。它用於處理時間,包括小時、分鐘、秒和毫秒。
  3. LocalDateTime:它是 LocalDateLocalTime 的組合,表示日期和時間,但仍不包含時區信息。它是處理日期和時間的主要類之一。
  4. ZonedDateTime:表示帶有時區信息的日期和時間。它是 LocalDateTime 的擴展,可以處理時區的轉換和計算。
  5. Duration:表示時間段的持續時間,以秒和納秒為單位。它用於測量兩個時間點之間的時間差。
  6. Period:表示日期之間的時間段,以年、月和日為單位。它用於測量兩個日期之間的時間差。
  7. DateTimeFormatter:主要用於將日期和時間格式化為字元串,或將字元串解析為日期和時間。它提供了各種預定義的格式化方式,並支持自定義格式。

1. LocalDate

直接通過調用其相關靜態方法就可以進行相關的日期處理:

LocalDate now = LocalDate.now(); 			// 獲取當前日期
LocalDate date = LocalDate.of(2023, 5, 15); // 創建指定日期
LocalDate parsedDate = LocalDate.parse("2023-05-15"); // 解析日期
int year = date.getYear(); 			// 獲取年份
int month = date.getMonthValue(); 	// 獲取月份
int day = date.getDayOfMonth(); 	// 獲取日期

2. LocalTime

同理,也是類似的,對時間進行處理:

LocalTime time = LocalTime.now(); 					// 獲取當前時間
LocalTime specificTime = LocalTime.of(14, 30, 0); 	// 創建指定時間
LocalTime parsedTime = LocalTime.parse("14:30:00"); // 解析時間
int hour = time.getHour(); 		// 獲取小時
int minute = time.getMinute(); 	// 獲取分鐘
int second = time.getSecond(); 	// 獲取秒

3. LocalDateTime

處理日期和時間:

LocalDateTime dateTime = LocalDateTime.now(); 								// 獲取當前日期和時間
LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 15, 14, 30); 	// 創建指定日期和時間
LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15T14:30:00"); 	// 解析日期和時間,字母'T'用於分隔日期部分和時間部分。它的作用是明確表示日期和時間的分界線。

4. ZonedDateTime

處理帶有時區的日期和時間,我們可以使用 ZoneId.of("時區標識") 來獲取相應的時區對象:

ZoneId zone = ZoneId.of("America/New_York"); 			// 創建時區
ZonedDateTime zonedDateTime = ZonedDateTime.now(zone); 	// 獲取帶有時區的當前日期和時間

帶有時區信息的日期時間通常採用以下的格式:

2023-09-08T11:30:00+08:00[Asia/Shanghai]

這個例子表示的是 2023年9月8日11點30分,位於亞洲/上海時區,時區偏移量為+08:00,也就是東八區。在這種表示中,日期時間後面跟著時區信息,方括弧內的部分為時區標識。

下麵是一些常見的時區標識及其對應的時區:

時區標識 時區
Asia/Shanghai 中國上海時區
America/New_York 美國紐約時區
Europe/London 英國倫敦時區
America/Los_Angeles 美國洛杉磯時區
Asia/Tokyo 日本東京時區
Europe/Paris 法國巴黎時區
Australia/Sydney 澳大利亞悉尼時區
Africa/Cairo 埃及開羅時區
Pacific/Honolulu 美國檀香山時區
Asia/Dubai 阿拉伯迪拜時區

5. Duration

測量時間段的持續時間:

LocalDateTime start = LocalDateTime.of(2023, 9, 8, 11, 0);
LocalDateTime end = LocalDateTime.of(2023, 9, 8, 11, 30);
Duration duration = Duration.between(start, end); 	// 計算兩個時間點之間的時間差
long minutes = duration.toMinutes(); 				// 獲取分鐘數

6. Period

測量日期之間的時間段:

LocalDate startDate = LocalDate.of(2023, 9, 1);
LocalDate endDate = LocalDate.of(2023, 9, 8);
Period period = Period.between(startDate, endDate); // 計算兩個日期之間的時間差
int days = period.getDays(); 						// 獲取天數

7. DateTimeFormatter

格式化日期和時間:

LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = dateTime.format(formatter); // 格式化為字元串
LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15 14:30:00", formatter); // 解析字元串為日期和時間

新日期時間 API 中常用的方法

以下是 Java 8 中新日期時間 API 中常用的方法,用於處理日期和時間的創建、獲取欄位值、計算差異、格式化和解析等:

方法 描述
LocalDate.now() 獲取當前日期。
LocalTime.now() 獲取當前時間。
LocalDateTime.now() 獲取當前日期和時間。
LocalDate.of(int year, int month, int day) 創建指定日期。
LocalTime.of(int hour, int minute) 創建指定時間。
LocalDateTime.of(int year, int month, int day, int hour, int minute) 創建指定日期和時間。
LocalDate.parse(CharSequence text) 解析日期字元串。
LocalTime.parse(CharSequence text) 解析時間字元串。
LocalDateTime.parse(CharSequence text) 解析日期時間字元串。
LocalDate.getYear() 獲取年份。
LocalDate.getMonthValue() 獲取月份。
LocalDate.getDayOfMonth() 獲取日期。
LocalTime.getHour() 獲取小時。
LocalTime.getMinute() 獲取分鐘。
LocalTime.getSecond() 獲取秒。
LocalDateTime.plus(Duration amount) 增加持續時間。
LocalDateTime.minus(Duration amount) 減少持續時間。
Duration.between(Temporal startInclusive, Temporal endExclusive) 計算兩個時間點之間的時間差。
Period.between(LocalDate startDateInclusive, LocalDate endDateExclusive) 計算兩個日期之間的時間差。
DateTimeFormatter.ofPattern(String pattern) 創建日期時間格式化器。
Temporal.format(DateTimeFormatter formatter) 格式化為字元串。
TemporalAccessor.parse(CharSequence text, DateTimeFormatter formatter) 解析字元串為日期或時間。
ZoneId.of(String zoneId) 創建時區。
ZonedDateTime.now(ZoneId zone) 獲取帶有時區的當前日期和時間。

開發中的用到的兩個註解

一般前端傳遞日期時間字元串,我們後端進行接收,就需要將日期時間字元串轉成我們需要的 Date 類型的日期時間,即 String 到 Date 的轉化

當我們從資料庫中查出日期時間,是 Date 類型的日期時間,返回給前端就提供 JSON 數據,就需要講 Date 類型的日期時間轉成 字元串類型的日期時間,即 Date 到 String 的轉化

有兩個註解可以解決這兩件事:Spring 提供的 @DateTimeFormat 和 Jackson 提供的 @JsonFormat

Jackson 相關依賴:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.13.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.13.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.4.2</version>
</dependency>

說明:

  • @DateTimeFormat將 String 轉成 Date,主要用於處理前端傳遞的 String 類型的日期時間轉成 Java 中的 Date 類型的日期時間對象
  • @JsonFormat將 Date 轉成 String,主要用於處理後端從資料庫中查出的 Date 類型的日期時間,它可以用於標記 Java 類的屬性,以指定日期在 JSON 中的格式。

日常用在各種域對象的日期屬性上,比如 DTO、VO、PO。

public class A {

    @JsonFormat(pattern = "yyyy年MM月", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy年MM月")
    private Date startTime;

    @JsonFormat(pattern = "yyyy年MM月", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy年MM月")
    private Date endTime;
    
}

public class B {

    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date startTime;

    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date endTime;
    
}

最後的最後

希望各位屏幕前的靚仔靚女們給個三連!你輕輕地點了個贊,那將在我的心裡世界增添一顆明亮而耀眼的星!

咱們下期再見!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在軟體開發中,我們經常會遇到這樣的情況:我們需要使用一個現有的類或者介面,但它與我們系統的目標介面不相容,而我們又不能修改它。這時候,我們該怎麼辦呢?大多數情況下我們都可以使用適配器模式來解決這個問題,**本文將從以下四個方面講解適配器模式**。 - 簡介 - 優缺點 - 應用場景 - Java 代 ...
  • ## 1. 什麼是Http2.0 HTTP/2.0,通常簡稱為HTTP/2,是一種用於傳輸超文本(例如網頁和資源文件)的網路協議。它是HTTP/1.1的繼任者,旨在提高性能和效率,以適應現代Web應用的需求。HTTP/2的主要特點包括以下幾點: 1. **多路復用(Multiplexing)**:H ...
  • 光看訪客這個名字,猜測這個訪客模式應該非常好理解,只要玩過Linux的人,都能深刻明白Root和非Root和訪客賬號登錄的巨大差別性。 # What is Visitor? 如果你沒玩過Linux,那麼假設公共的圖書館有一臺電腦,有兩個賬戶: - 其中一個是**管理員(Admin)**的賬戶,擁有這 ...
  • 作者:是奉壹呀 \ 來源:juejin.cn/post/7262274383287500860 看到一個評論,裡面提到了list.sort()和list.strem().sorted()排序的差異。 說到list sort()排序比stream().sorted()排序性能更好,但沒說到為什麼。 ! ...
  • Sermant是基於Java位元組碼增強技術的無代理服務網格,其利用Java位元組碼增強技術為宿主應用程式提供服務治理功能。 ...
  • 京東茅臺搶購腳本可以分為以下幾部分,具體實現步驟如下: 登錄京東賬號 首先需要登錄京東賬號。一個簡單的方式是使用Python的 selenium 庫。在使用 selenium 庫前,需要安裝 selenium 庫和對應的瀏覽器驅動。 示例代碼如下所示: from selenium import we ...
  • # It can explain what ? 如下是解釋器要解釋的主體: - 加減乘除等運算,3+4/9+6*8 - 摩爾斯電碼 - 正則表達式 - El表達式 - OGNL表達式 - 小明是北京人 - 小紅是一名售貨員 - 部門領導下發一則通知 - ... # How explain ? 解釋器 ...
  • # ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/98edff345fb44c9ca30237fa7958f6f8~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1920&h=1080&s=72 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...