Java中日期時間的用法總結
前言
在日常開發(fā)中,我們經(jīng)常需要處理日期和時間,日期和時間可以說是一定會用到的,現(xiàn)在總結下 Java 中日期與時間的基本概念與一些常用的用法。
基本概念
日期(年月日,某一天):2023-01-05
時間(時分秒,可具體到某一天某一刻):18:00:00、2023-01-05 18:00:00
本地時間:平常我們說的,比如現(xiàn)在說明天早上七點鐘,這里說的時間就是本地時間,在咱們中國,指的就是北京時間。但是在明天早上七點鐘,對于其他國家的人來說,他們的本地時間就不一樣了。
時區(qū):由于世界各個國家與地區(qū)經(jīng)度不同,本地時間也有所不同,所以劃分了不同的時區(qū),目前劃分的是24個時區(qū),咱們就位于東八區(qū)。目前需要了解的時區(qū)的表達方式知道兩種就可以了。
- 以
GMT或者UTC加時區(qū)偏移量表示,例如:GMT+08:00或者UTC+08:00表示東八區(qū) - 以
洲/城市表示,例如,Asia/Shanghai,表示上海所在地的時區(qū)。不過這里的城市名稱不是任意的城市,而是由國際標準組織規(guī)定的城市。
Java 8 之前日期時間相關的類
在 Java 8 之前,主要使用的日期和時間 API 包括:
java.util.Datejava.util.Calendarjava.text.SimpleDateFormat
1. Date
Date 是 Java 中表示日期和時間的類,一般用于獲取當前的日期和時間,比如更新數(shù)據(jù)庫中記錄的時候,需要更新某個日期時間,那么就直接 new Date(),這樣實例化的 Date 對象就是當前的這一時刻。
Date date = new Date(); // 可以打印當前日期時間 System.out.println(date.toString()); // 控制臺輸出 Thu Jan 05 18:41:11 CST 2023
2. SimpleDateFormat
SimpleDateFormat 是 Java 中用于格式化日期和時間的類,此處所謂格式化,就是字面意思,統(tǒng)一格式,即它允許你將日期和時間按照指定的格式轉換成字符串,也可以將對應格式的字符串解析成日期和時間對象。
主要用法就是:
- 格式化日期和時間
- 解析字符串格式的日期和時間
format 方法-格式化日期時間,從 Date 到 String
使用 public final String format(Date date) 方法格式化日期時間。上面輸出的格式,不是我們想要的,所以需要進行日期時間的格式化。
最常用的一個格式化的模型是:yyyy-MM-dd HH:mm:ss
其中,yyyy 是年份,MM 是月份,dd 是天數(shù),后面同理,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使用的時區(qū)。 |
| setTimeZone(TimeZone zone) | 設置此Calendar的時區(qū)。 |
| isLenient() | 返回Calendar是否寬松,即是否允許非法日期。 |
| setLenient(boolean lenient) | 設置Calendar是否寬松。 |
| getActualMaximum(int field) | 返回給定字段的最大允許值。例如,calendar.getActualMaximum(Calendar.DAY_OF_MONTH) 返回當前月份的最大天數(shù)。 |
Java 8 引入的新的日期時間相關的類
當 Java 8 引入 java.time 包時,它引入了一些新的日期和時間 API,這些 API 旨在提供更強大、更易于使用、線程安全且具有本地化支持的日期和時間處理方式。
以下是這些 API 的概述:
LocalDate:表示日期,但不包含時間和時區(qū)信息。它提供了各種方法來處理日期,如創(chuàng)建、解析、格式化、計算日期差等。LocalTime:表示時間,但不包含日期和時區(qū)信息。它用于處理時間,包括小時、分鐘、秒和毫秒。LocalDateTime:它是LocalDate和LocalTime的組合,表示日期和時間,但仍不包含時區(qū)信息。它是處理日期和時間的主要類之一。ZonedDateTime:表示帶有時區(qū)信息的日期和時間。它是LocalDateTime的擴展,可以處理時區(qū)的轉換和計算。Duration:表示時間段的持續(xù)時間,以秒和納秒為單位。它用于測量兩個時間點之間的時間差。Period:表示日期之間的時間段,以年、月和日為單位。它用于測量兩個日期之間的時間差。DateTimeFormatter:主要用于將日期和時間格式化為字符串,或將字符串解析為日期和時間。它提供了各種預定義的格式化方式,并支持自定義格式。
1. LocalDate
直接通過調用其相關靜態(tài)方法就可以進行相關的日期處理:
LocalDate now = LocalDate.now(); // 獲取當前日期
LocalDate date = LocalDate.of(2023, 5, 15); // 創(chuàng)建指定日期
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); // 創(chuàng)建指定時間
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); // 創(chuàng)建指定日期和時間
LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15T14:30:00"); // 解析日期和時間,字母'T'用于分隔日期部分和時間部分。它的作用是明確表示日期和時間的分界線。4. ZonedDateTime
處理帶有時區(qū)的日期和時間,我們可以使用 ZoneId.of("時區(qū)標識") 來獲取相應的時區(qū)對象:
ZoneId zone = ZoneId.of("America/New_York"); // 創(chuàng)建時區(qū)
ZonedDateTime zonedDateTime = ZonedDateTime.now(zone); // 獲取帶有時區(qū)的當前日期和時間帶有時區(qū)信息的日期時間通常采用以下的格式:
2023-09-08T11:30:00+08:00[Asia/Shanghai]
這個例子表示的是 2023年9月8日11點30分,位于亞洲/上海時區(qū),時區(qū)偏移量為+08:00,也就是東八區(qū)。在這種表示中,日期時間后面跟著時區(qū)信息,方括號內的部分為時區(qū)標識。
下面是一些常見的時區(qū)標識及其對應的時區(qū):
| 時區(qū)標識 | 時區(qū) |
|---|---|
| Asia/Shanghai | 中國上海時區(qū) |
| America/New_York | 美國紐約時區(qū) |
| Europe/London | 英國倫敦時區(qū) |
| America/Los_Angeles | 美國洛杉磯時區(qū) |
| Asia/Tokyo | 日本東京時區(qū) |
| Europe/Paris | 法國巴黎時區(qū) |
| Australia/Sydney | 澳大利亞悉尼時區(qū) |
| Africa/Cairo | 埃及開羅時區(qū) |
| Pacific/Honolulu | 美國檀香山時區(qū) |
| Asia/Dubai | 阿拉伯迪拜時區(qū) |
5. Duration
測量時間段的持續(xù)時間:
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(); // 獲取分鐘數(shù)
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(); // 獲取天數(shù)
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 中常用的方法,用于處理日期和時間的創(chuàng)建、獲取字段值、計算差異、格式化和解析等:
| 方法 | 描述 |
|---|---|
| LocalDate.now() | 獲取當前日期。 |
| LocalTime.now() | 獲取當前時間。 |
| LocalDateTime.now() | 獲取當前日期和時間。 |
| LocalDate.of(int year, int month, int day) | 創(chuàng)建指定日期。 |
| LocalTime.of(int hour, int minute) | 創(chuàng)建指定時間。 |
| LocalDateTime.of(int year, int month, int day, int hour, int minute) | 創(chuàng)建指定日期和時間。 |
| 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) | 增加持續(xù)時間。 |
| LocalDateTime.minus(Duration amount) | 減少持續(xù)時間。 |
| Duration.between(Temporal startInclusive, Temporal endExclusive) | 計算兩個時間點之間的時間差。 |
| Period.between(LocalDate startDateInclusive, LocalDate endDateExclusive) | 計算兩個日期之間的時間差。 |
| DateTimeFormatter.ofPattern(String pattern) | 創(chuàng)建日期時間格式化器。 |
| Temporal.format(DateTimeFormatter formatter) | 格式化為字符串。 |
| TemporalAccessor.parse(CharSequence text, DateTimeFormatter formatter) | 解析字符串為日期或時間。 |
| ZoneId.of(String zoneId) | 創(chuàng)建時區(qū)。 |
| ZonedDateTime.now(ZoneId zone) | 獲取帶有時區(qū)的當前日期和時間。 |
開發(fā)中的用到的兩個注解
一般前端傳遞日期時間字符串,我們后端進行接收,就需要將日期時間字符串轉成我們需要的 Date 類型的日期時間,即 String 到 Date 的轉化
當我們從數(shù)據(jù)庫中查出日期時間,是 Date 類型的日期時間,返回給前端就提供 JSON 數(shù)據(jù),就需要講 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,主要用于處理后端從數(shù)據(jù)庫中查出的 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;
}以上就是Java中日期時間的用法總結的詳細內容,更多關于Java日期時間的資料請關注腳本之家其它相關文章!
相關文章
Spring-AOP-ProceedingJoinPoint的使用詳解
這篇文章主要介紹了Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
Druid基本配置及內置監(jiān)控使用_動力節(jié)點Java學院整理
這篇文章主要介紹了Druid基本配置及內置監(jiān)控使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08

