Java中日期時(shí)間的用法總結(jié)
前言
在日常開發(fā)中,我們經(jīng)常需要處理日期和時(shí)間,日期和時(shí)間可以說(shuō)是一定會(huì)用到的,現(xiàn)在總結(jié)下 Java 中日期與時(shí)間的基本概念與一些常用的用法。
基本概念
日期(年月日,某一天):2023-01-05
時(shí)間(時(shí)分秒,可具體到某一天某一刻):18:00:00
、2023-01-05 18:00:00
本地時(shí)間:平常我們說(shuō)的,比如現(xiàn)在說(shuō)明天早上七點(diǎn)鐘,這里說(shuō)的時(shí)間就是本地時(shí)間,在咱們中國(guó),指的就是北京時(shí)間。但是在明天早上七點(diǎn)鐘,對(duì)于其他國(guó)家的人來(lái)說(shuō),他們的本地時(shí)間就不一樣了。
時(shí)區(qū):由于世界各個(gè)國(guó)家與地區(qū)經(jīng)度不同,本地時(shí)間也有所不同,所以劃分了不同的時(shí)區(qū),目前劃分的是24個(gè)時(shí)區(qū),咱們就位于東八區(qū)。目前需要了解的時(shí)區(qū)的表達(dá)方式知道兩種就可以了。
- 以
GMT
或者UTC
加時(shí)區(qū)偏移量表示,例如:GMT+08:00
或者UTC+08:00
表示東八區(qū) - 以
洲/城市
表示,例如,Asia/Shanghai
,表示上海所在地的時(shí)區(qū)。不過(guò)這里的城市名稱不是任意的城市,而是由國(guó)際標(biāo)準(zhǔn)組織規(guī)定的城市。
Java 8 之前日期時(shí)間相關(guān)的類
在 Java 8 之前,主要使用的日期和時(shí)間 API 包括:
java.util.Date
java.util.Calendar
java.text.SimpleDateFormat
1. Date
Date
是 Java 中表示日期和時(shí)間的類,一般用于獲取當(dāng)前的日期和時(shí)間,比如更新數(shù)據(jù)庫(kù)中記錄的時(shí)候,需要更新某個(gè)日期時(shí)間,那么就直接 new Date()
,這樣實(shí)例化的 Date 對(duì)象就是當(dāng)前的這一時(shí)刻。
Date date = new Date(); // 可以打印當(dāng)前日期時(shí)間 System.out.println(date.toString()); // 控制臺(tái)輸出 Thu Jan 05 18:41:11 CST 2023
2. SimpleDateFormat
SimpleDateFormat
是 Java 中用于格式化日期和時(shí)間的類,此處所謂格式化,就是字面意思,統(tǒng)一格式,即它允許你將日期和時(shí)間按照指定的格式轉(zhuǎn)換成字符串,也可以將對(duì)應(yīng)格式的字符串解析成日期和時(shí)間對(duì)象。
主要用法就是:
- 格式化日期和時(shí)間
- 解析字符串格式的日期和時(shí)間
format 方法-格式化日期時(shí)間,從 Date 到 String
使用 public final String format(Date date)
方法格式化日期時(shí)間。上面輸出的格式,不是我們想要的,所以需要進(jìn)行日期時(shí)間的格式化。
最常用的一個(gè)格式化的模型是:yyyy-MM-dd HH:mm:ss
其中,yyyy
是年份,MM
是月份,dd
是天數(shù),后面同理,HH:mm:ss
是時(shí)、分、秒。
// 常用的格式化 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時(shí)mm分ss秒"; SimpleDateFormat sdf2 = new SimpleDateFormat(pattern2); System.out.println(sdf2.format(date3)); // 輸出 2023年01月05日 18時(shí)19分50秒
parse 方法-字符串日期時(shí)間解析,從 String 到 Date
使用 public Date parse(String source)
方法將 String 轉(zhuǎn)成 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 中用于處理日期和時(shí)間的抽象基類。它提供了一個(gè)類似于日歷的機(jī)制,允許我們進(jìn)行日期和時(shí)間的計(jì)算、格式化和解析。
簡(jiǎn)而言之,這個(gè)類主要用于日期的計(jì)算,比如你想得到此刻前一天的日期。
Calendar
是一個(gè)抽象類,不能直接實(shí)例化。所以我們需要使用 getInstance()
方法獲取 Calendar
的實(shí)例:
Calendar calendar = Calendar.getInstance();
當(dāng)我們有一個(gè) Calendar
對(duì)象后,就可以表示日期和時(shí)間了,通過(guò)設(shè)置各個(gè)字段,如年、月、日、時(shí)、分、秒等來(lái)表示一個(gè)具體的日期和時(shí)間。
calendar.set(Calendar.YEAR, 2023); // 設(shè)置年份為2023 calendar.set(Calendar.MONTH, Calendar.MAY); // 設(shè)置月份為5(從0開始,5表示六月) calendar.set(Calendar.DAY_OF_MONTH, 16); // 設(shè)置日期為16號(hào)
日期和時(shí)間的計(jì)算
Calendar
允許你進(jìn)行日期和時(shí)間的加減操作,例如:
calendar.add(Calendar.DAY_OF_MONTH, 7); // 增加7天
這將在當(dāng)前日期的基礎(chǔ)上增加 7 天。
下表列出了 Java 中 Calendar 類常用的方法及其描述:
方法 | 描述 |
---|---|
get(int field) | 返回給定字段的值。例如,calendar.get(Calendar.MONTH) 返回月份。 |
set(int field, int value) | 設(shè)置給定字段的值。例如,calendar.set(Calendar.YEAR, 2023) 設(shè)置年份為2023。 |
add(int field, int amount) | 增加或減少給定字段的值。例如,calendar.add(Calendar.DAY_OF_MONTH, 1) 將日期增加一天。 |
getTime() | 返回表示此Calendar時(shí)間點(diǎn)的Date對(duì)象。 |
setTime(Date date) | 使用指定的Date對(duì)象設(shè)置此Calendar的時(shí)間點(diǎn)。 |
getTimeInMillis() | 返回以毫秒為單位表示此Calendar時(shí)間點(diǎn)的時(shí)間值。 |
setTimeInMillis(long millis) | 使用指定的時(shí)間值設(shè)置此Calendar的時(shí)間點(diǎn)。 |
getTimeZone() | 返回此Calendar使用的時(shí)區(qū)。 |
setTimeZone(TimeZone zone) | 設(shè)置此Calendar的時(shí)區(qū)。 |
isLenient() | 返回Calendar是否寬松,即是否允許非法日期。 |
setLenient(boolean lenient) | 設(shè)置Calendar是否寬松。 |
getActualMaximum(int field) | 返回給定字段的最大允許值。例如,calendar.getActualMaximum(Calendar.DAY_OF_MONTH) 返回當(dāng)前月份的最大天數(shù)。 |
Java 8 引入的新的日期時(shí)間相關(guān)的類
當(dāng) Java 8 引入 java.time
包時(shí),它引入了一些新的日期和時(shí)間 API,這些 API 旨在提供更強(qiáng)大、更易于使用、線程安全且具有本地化支持的日期和時(shí)間處理方式。
以下是這些 API 的概述:
LocalDate
:表示日期,但不包含時(shí)間和時(shí)區(qū)信息。它提供了各種方法來(lái)處理日期,如創(chuàng)建、解析、格式化、計(jì)算日期差等。LocalTime
:表示時(shí)間,但不包含日期和時(shí)區(qū)信息。它用于處理時(shí)間,包括小時(shí)、分鐘、秒和毫秒。LocalDateTime
:它是LocalDate
和LocalTime
的組合,表示日期和時(shí)間,但仍不包含時(shí)區(qū)信息。它是處理日期和時(shí)間的主要類之一。ZonedDateTime
:表示帶有時(shí)區(qū)信息的日期和時(shí)間。它是LocalDateTime
的擴(kuò)展,可以處理時(shí)區(qū)的轉(zhuǎn)換和計(jì)算。Duration
:表示時(shí)間段的持續(xù)時(shí)間,以秒和納秒為單位。它用于測(cè)量?jī)蓚€(gè)時(shí)間點(diǎn)之間的時(shí)間差。Period
:表示日期之間的時(shí)間段,以年、月和日為單位。它用于測(cè)量?jī)蓚€(gè)日期之間的時(shí)間差。DateTimeFormatter
:主要用于將日期和時(shí)間格式化為字符串,或?qū)⒆址?strong>解析為日期和時(shí)間。它提供了各種預(yù)定義的格式化方式,并支持自定義格式。
1. LocalDate
直接通過(guò)調(diào)用其相關(guān)靜態(tài)方法就可以進(jìn)行相關(guān)的日期處理:
LocalDate now = LocalDate.now(); // 獲取當(dāng)前日期 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
同理,也是類似的,對(duì)時(shí)間進(jìn)行處理:
LocalTime time = LocalTime.now(); // 獲取當(dāng)前時(shí)間 LocalTime specificTime = LocalTime.of(14, 30, 0); // 創(chuàng)建指定時(shí)間 LocalTime parsedTime = LocalTime.parse("14:30:00"); // 解析時(shí)間 int hour = time.getHour(); // 獲取小時(shí) int minute = time.getMinute(); // 獲取分鐘 int second = time.getSecond(); // 獲取秒
3. LocalDateTime
處理日期和時(shí)間:
LocalDateTime dateTime = LocalDateTime.now(); // 獲取當(dāng)前日期和時(shí)間 LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 15, 14, 30); // 創(chuàng)建指定日期和時(shí)間 LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15T14:30:00"); // 解析日期和時(shí)間,字母'T'用于分隔日期部分和時(shí)間部分。它的作用是明確表示日期和時(shí)間的分界線。
4. ZonedDateTime
處理帶有時(shí)區(qū)的日期和時(shí)間,我們可以使用 ZoneId.of("時(shí)區(qū)標(biāo)識(shí)")
來(lái)獲取相應(yīng)的時(shí)區(qū)對(duì)象:
ZoneId zone = ZoneId.of("America/New_York"); // 創(chuàng)建時(shí)區(qū) ZonedDateTime zonedDateTime = ZonedDateTime.now(zone); // 獲取帶有時(shí)區(qū)的當(dāng)前日期和時(shí)間
帶有時(shí)區(qū)信息的日期時(shí)間通常采用以下的格式:
2023-09-08T11:30:00+08:00[Asia/Shanghai]
這個(gè)例子表示的是 2023年9月8日11點(diǎn)30分
,位于亞洲/上海
時(shí)區(qū),時(shí)區(qū)偏移量為+08:00
,也就是東八區(qū)。在這種表示中,日期時(shí)間后面跟著時(shí)區(qū)信息,方括號(hào)內(nèi)的部分為時(shí)區(qū)標(biāo)識(shí)。
下面是一些常見(jiàn)的時(shí)區(qū)標(biāo)識(shí)及其對(duì)應(yīng)的時(shí)區(qū):
時(shí)區(qū)標(biāo)識(shí) | 時(shí)區(qū) |
---|---|
Asia/Shanghai | 中國(guó)上海時(shí)區(qū) |
America/New_York | 美國(guó)紐約時(shí)區(qū) |
Europe/London | 英國(guó)倫敦時(shí)區(qū) |
America/Los_Angeles | 美國(guó)洛杉磯時(shí)區(qū) |
Asia/Tokyo | 日本東京時(shí)區(qū) |
Europe/Paris | 法國(guó)巴黎時(shí)區(qū) |
Australia/Sydney | 澳大利亞悉尼時(shí)區(qū) |
Africa/Cairo | 埃及開羅時(shí)區(qū) |
Pacific/Honolulu | 美國(guó)檀香山時(shí)區(qū) |
Asia/Dubai | 阿拉伯迪拜時(shí)區(qū) |
5. Duration
測(cè)量時(shí)間段的持續(xù)時(shí)間:
LocalDateTime start = LocalDateTime.of(2023, 9, 8, 11, 0); LocalDateTime end = LocalDateTime.of(2023, 9, 8, 11, 30); Duration duration = Duration.between(start, end); // 計(jì)算兩個(gè)時(shí)間點(diǎn)之間的時(shí)間差 long minutes = duration.toMinutes(); // 獲取分鐘數(shù)
6. Period
測(cè)量日期之間的時(shí)間段:
LocalDate startDate = LocalDate.of(2023, 9, 1); LocalDate endDate = LocalDate.of(2023, 9, 8); Period period = Period.between(startDate, endDate); // 計(jì)算兩個(gè)日期之間的時(shí)間差 int days = period.getDays(); // 獲取天數(shù)
7. DateTimeFormatter
格式化日期和時(shí)間:
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); // 解析字符串為日期和時(shí)間
新日期時(shí)間 API 中常用的方法
以下是 Java 8 中新日期時(shí)間 API 中常用的方法,用于處理日期和時(shí)間的創(chuàng)建、獲取字段值、計(jì)算差異、格式化和解析等:
方法 | 描述 |
---|---|
LocalDate.now() | 獲取當(dāng)前日期。 |
LocalTime.now() | 獲取當(dāng)前時(shí)間。 |
LocalDateTime.now() | 獲取當(dāng)前日期和時(shí)間。 |
LocalDate.of(int year, int month, int day) | 創(chuàng)建指定日期。 |
LocalTime.of(int hour, int minute) | 創(chuàng)建指定時(shí)間。 |
LocalDateTime.of(int year, int month, int day, int hour, int minute) | 創(chuàng)建指定日期和時(shí)間。 |
LocalDate.parse(CharSequence text) | 解析日期字符串。 |
LocalTime.parse(CharSequence text) | 解析時(shí)間字符串。 |
LocalDateTime.parse(CharSequence text) | 解析日期時(shí)間字符串。 |
LocalDate.getYear() | 獲取年份。 |
LocalDate.getMonthValue() | 獲取月份。 |
LocalDate.getDayOfMonth() | 獲取日期。 |
LocalTime.getHour() | 獲取小時(shí)。 |
LocalTime.getMinute() | 獲取分鐘。 |
LocalTime.getSecond() | 獲取秒。 |
LocalDateTime.plus(Duration amount) | 增加持續(xù)時(shí)間。 |
LocalDateTime.minus(Duration amount) | 減少持續(xù)時(shí)間。 |
Duration.between(Temporal startInclusive, Temporal endExclusive) | 計(jì)算兩個(gè)時(shí)間點(diǎn)之間的時(shí)間差。 |
Period.between(LocalDate startDateInclusive, LocalDate endDateExclusive) | 計(jì)算兩個(gè)日期之間的時(shí)間差。 |
DateTimeFormatter.ofPattern(String pattern) | 創(chuàng)建日期時(shí)間格式化器。 |
Temporal.format(DateTimeFormatter formatter) | 格式化為字符串。 |
TemporalAccessor.parse(CharSequence text, DateTimeFormatter formatter) | 解析字符串為日期或時(shí)間。 |
ZoneId.of(String zoneId) | 創(chuàng)建時(shí)區(qū)。 |
ZonedDateTime.now(ZoneId zone) | 獲取帶有時(shí)區(qū)的當(dāng)前日期和時(shí)間。 |
開發(fā)中的用到的兩個(gè)注解
一般前端傳遞日期時(shí)間字符串,我們后端進(jìn)行接收,就需要將日期時(shí)間字符串轉(zhuǎn)成我們需要的 Date 類型的日期時(shí)間,即 String 到 Date 的轉(zhuǎn)化
當(dāng)我們從數(shù)據(jù)庫(kù)中查出日期時(shí)間,是 Date 類型的日期時(shí)間,返回給前端就提供 JSON 數(shù)據(jù),就需要講 Date 類型的日期時(shí)間轉(zhuǎn)成 字符串類型的日期時(shí)間,即 Date 到 String 的轉(zhuǎn)化
有兩個(gè)注解可以解決這兩件事:Spring 提供的 @DateTimeFormat
和 Jackson 提供的 @JsonFormat
Jackson 相關(guān)依賴:
<!-- 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>
說(shuō)明:
@DateTimeFormat
:將 String 轉(zhuǎn)成 Date,主要用于處理前端傳遞的 String 類型的日期時(shí)間轉(zhuǎn)成 Java 中的 Date 類型的日期時(shí)間對(duì)象@JsonFormat
:將 Date 轉(zhuǎn)成 String,主要用于處理后端從數(shù)據(jù)庫(kù)中查出的 Date 類型的日期時(shí)間,它可以用于標(biāo)記 Java 類的屬性,以指定日期在 JSON 中的格式。
日常用在各種域?qū)ο蟮娜掌趯傩陨?,比?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中日期時(shí)間的用法總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Java日期時(shí)間的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java之Spring簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象
這篇文章主要介紹了Spring的讀取和存儲(chǔ)對(duì)象,獲取 bean 對(duì)象也叫做對(duì)象裝配,是把對(duì)象取出來(lái)放到某個(gè)類中,有時(shí)候也叫對(duì)象注?,想進(jìn)一步了解的同學(xué)可以參考本文2023-04-04Spring-AOP-ProceedingJoinPoint的使用詳解
這篇文章主要介紹了Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03Spring Boot Shiro在Web應(yīng)用中的作用詳解
這篇文章主要為大家介紹了Spring Boot Shiro在Web應(yīng)用中的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Druid基本配置及內(nèi)置監(jiān)控使用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Druid基本配置及內(nèi)置監(jiān)控使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08Java動(dòng)態(tài)代理四種實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Java四種動(dòng)態(tài)代理實(shí)現(xiàn)方式,對(duì)于開始學(xué)習(xí)java動(dòng)態(tài)代理或者要復(fù)習(xí)java動(dòng)態(tài)代理的朋友來(lái)講很有參考價(jià)值,有感興趣的朋友可以參考一下2021-04-04