深入了解Java 8日期時間新玩法:DateTimeFormatter與ZoneOffset的使用

?

推薦語

在這篇文章中,我們將深入探討Java中的DateTimeFormatter和ZoneOffset類的功能和使用方法。這些類是在Java 8中引入的新的日期時間API的一部分,它們為我們提供了更靈活、更易用的日期和時間處理能力。盡管這些類在Java 8中已經出現,但是對許多開發人員來說,它們可能仍然相對陌生。因此,本文旨在幫助讀者更好地理解這些類的基本概念、核心方法和實際應用場景。

通過本文的介紹,您將了解如何使用DateTimeFormatter和ZoneOffset類來處理日期時間,以及如何在實際開發中應用它們。盡管本文是一些相對較基礎的內容,但我們希望通過分享這些知識,能夠激發您對Java日期時間處理的興趣和熱情。

如果您對Java日期時間處理有更深入的需求或問題,我們鼓勵您在評論區留言,讓我們一起探討和學習。當然,如果方便話,麻煩小伙伴能夠把免費的點贊、收藏,走上一波!創作不易,感謝支持!

注意

本文編寫的單元測試是基于java11,具體的版本號是:11.0.19

DateTimeFormatter

DateTimeFormatter是Java 8中引入的一個日期時間格式化工具,用于打印和解析日期時間對象。它使用用戶定義的格式(如"yyyy-MMM-dd hh:mm:ss")或使用預定義的常數(如ISO_LOCAL_DATE_TIME)來格式化日期時間。DateTimeFormatter是不可變的,并且是線程安全的,這使得它可以在多線程環境下安全使用。和SimpleDateFormat不同的是,DateTimeFormatter不但是不變對象,它還是線程安全的,因為SimpleDateFormat不是線程安全的,使用的時候,只能在方法內部創建新的局部變量。而DateTimeFormatter可以只創建一個實例,到處引用。

核心方法

  • DateTimeFormatter.ofPattern(String pattern): 根據指定的格式化字符串創建DateTimeFormatter實例。
  • DateTimeFormatter.format(LocalDateTime dateTime): 將給定的LocalDateTime對象格式化為指定的格式。
  • DateTimeFormatter.format(ZonedDateTime dateTime): 將給定的ZonedDateTime對象格式化為指定的格式。
  • DateTimeFormatter.format(OffsetDateTime dateTime): 將給定的OffsetDateTime對象格式化為指定的格式。
@Test
public void test() {DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");dateTimeFormatter.format(LocalDateTime.now());dateTimeFormatter.format(ZonedDateTime.now());dateTimeFormatter.format(OffsetDateTime.now(ZoneId.systemDefault()));
}

使用場景

日期和時間的格式化與解析:DateTimeFormatter主要用于將日期和時間對象格式化為字符串,或者將字符串解析為日期和時間對象。這在日志記錄、數據傳輸和存儲等場景中非常常見。例如,你可以將一個LocalDateTime對象格式化為"yyyy-MM-dd HH:mm:ss"格式的字符串,或者將一個字符串解析為LocalDateTime對象。

ZoneOffset

在Java8中,ZoneOffset類表示的是一種時間偏移量,可以簡單理解為從一個基準時間(通常是UTC)到特定時區的偏移量。它包含了一些屬性和方法,使用ZoneOffset可以方便地將一個時間從一個時區轉換為另一個時區。例如,如果你有一個在UTC的時間,你可以使用ZoneOffset來將其轉換為其他時區的時間。同樣,如果你有一個在其他時區的時間,你可以使用ZoneOffset來將其轉換為UTC時間。

UTC時間是指協調世界時(Coordinated Universal Time),也稱為世界標準時間。它是全球統一使用的時間標準,用于協調跨越不同時區的時間。UTC通常以24小時制表示,格式為hh:mm:ss,表示小時、分鐘和秒數。UTC時間不受夏令時的影響,保持恒定,而且被廣泛用于全球各個領域,如航空、天文學、計算機網絡等,以確保時間的一致性。

核心方法

  • ZoneOffset.of(String):這個方法接受一個表示偏移量的字符串,比如"+08:00"或"-05:30"。該方法會解析字符串并創建一個對應的ZoneOffset對象。
  • ZoneOffset.ofHours(int):這個方法接受一個表示小時數的整數,然后返回一個偏移量為此小時數的ZoneOffset對象。例如,調用ZoneOffset.ofHours(8)將返回一個表示偏移量為+08:00的ZoneOffset對象。
  • ZoneOffset.ofHoursMinutes(int, int):這個方法接受兩個整數,分別表示小時數和分鐘數。然后返回一個偏移量為此小時和分鐘數的ZoneOffset對象。例如,調用ZoneOffset.ofHoursMinutes(8, 30)將返回一個表示偏移量為+08:30的ZoneOffset對象。
  • ZoneOffset.ofHoursMinutesSeconds(int, int, int):這個方法接受三個整數,分別表示小時數、分鐘數和秒數。然后返回一個偏移量為此小時、分鐘和秒數的ZoneOffset對象。例如,調用ZoneOffset.ofHoursMinutesSeconds(8, 30, 45)將返回一個表示偏移量為+08:30:45的ZoneOffset對象。
@Test
public void test2() {//第一種用法示例:// 使用"Z"創建一個表示UTC的ZoneOffset對象,即格林尼治時間ZoneOffset utc = ZoneOffset.of("Z");System.out.println("UTC: " + utc);ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 12, 7, 13, 23, 32, 0, ZoneId.systemDefault());System.out.println(zonedDateTime);//當前日期時間:2023-12-07T13:23:32+08:00[Asia/Shanghai]ZonedDateTime with = zonedDateTime.withZoneSameInstant(utc);//當前時間,在同一時刻的格林泥治時間System.out.println(with);//輸出結果:2023-12-07T05:23:32Z,當前本地是北京時間,即東八區時間,與位于零時區的格林泥治時間相差是8小時;//第二種用法示例:// 使用"+"和"-"符號創建一個表示偏移量的ZoneOffset對象ZoneOffset offset = ZoneOffset.of("+08:00"); // 表示比UTC時間超前八個小時System.out.println("Offset: " + offset);ZonedDateTime zonedDateTime2 = ZonedDateTime.of(2023, 12, 7, 13, 23, 32, 0, ZoneId.systemDefault());System.out.println(zonedDateTime2);//當前日期時間:2023-12-07T13:23:32+08:00[Asia/Shanghai]ZonedDateTime with2 = zonedDateTime2.withZoneSameInstant(offset);//當前時間,在同一時刻的格林泥治時間System.out.println(with);//輸出結果:2023-12-07T05:23:32Z,當前本地是北京時間,即東八區時間,與位于零時區的格林泥治時間相差是8小時;
}

使用場景

ZoneOffset的使用場景通常是在需要將時間從一個時區轉換為另一個時區的情況下。例如,假設你有一個服務器,它需要同時處理來自不同時區的用戶請求,那么你就可以使用ZoneOffset來進行時區的轉換。

以下是一個使用ZoneOffset的示例:

假設你正在開發一個電子商務網站,用戶可以注冊并選擇自己的時區。當用戶瀏覽網站上的商品或查看訂單時,你希望根據用戶選擇的時區來顯示正確的時間。為了實現這個功能,你可以使用ZoneOffset將服務器的時間(通常是UTC時間)轉換為用戶的時區時間。

具體實現可以如下:

  • 當用戶注冊時,讓他們選擇一個時區。你可以使用ZoneOffset類來提供一些預設的時區選項,或者讓用戶自行輸入他們的時區偏移量。
  • 當用戶瀏覽網站上的商品或查看訂單時,你可以使用ZoneOffset將服務器的時間轉換為用戶的時區時間。例如,你可以使用ZoneOffset.ofHoursMinutes(-5, 0)來將UTC時間轉換為美國東部時間的時區偏移量。
  • 將轉換后的時間顯示在網頁上,以便用戶可以按照他們選擇的時區來查看商品或訂單的正確時間。

這個示例展示了如何使用ZoneOffset將服務器的時間轉換為用戶的時區時間,以便提供更準確和個性化的用戶體驗。通過使用ZoneOffset,你可以輕松地在不同時區之間進行轉換,并確保用戶能夠按照他們選擇的時區來查看和操作數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208647.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ELK(六)—Filebeat安裝部署

目錄 一、介紹1.1特點1.2使用原因1.3結構圖1.4工作流程 二、安裝部署2.1下載2.2啟動2.3監控日志文件2.4自定義字段 三、連接Elasticsearch四、工作原理 一、介紹 Filebeat是一個輕量級的日志和文件數據收集器,屬于Elastic Stack(ELK Stack)中…

近期Chrome瀏覽器 不知哪個版本升級后原先http強制跳轉到https,導致服務端302強制跳轉到http也沒反應

關于Chrome更新http強制跳轉到https解決方法 近期Chrome瀏覽器 不知哪個版本升級后原先http強制跳轉到https,導致服務端302強制跳轉到http也沒反應一、F12檢查加載的Response Headers中有沒有Non-Authoritative-Reason二、找了資料后得到解決方案:三、找…

云原生數據庫是什么?它的作用是啥?

目前來說,各廠商的云原生數據庫在演進路線上分成了兩個略有不同的路徑來解決不同的問題。 一種是各大公有云廠商選擇的,優先保證上云兼容性的路線,就是基于存算分離架構對傳統數據庫進行改造的路線:通過把大量的日志操作放到后臺…

插入排序——直接插入排序和希爾排序(C語言實現)

文章目錄 前言直接插入排序基本思想特性總結代碼實現 希爾排序算法思想特性總結代碼實現 前言 本博客插入排序動圖和希爾排序視頻參考大佬java技術愛好者,如有侵權,請聯系刪除。 直接插入排序 基本思想 直接插入排序是一種簡單的插入排序法&#xff…

圖空圖床圖片外鏈系統源碼-支持自定義權限策略-圖片大小格式

含視頻搭建教程。 大致功能: 支持本地等多種第三方云儲存 AWS S3、阿里云 OSS、騰訊云 COS、七牛云、又拍云、SFTP、FTP、WebDav、Minio多種數據庫驅動支持,MySQL 5.7、PostgreSQL 9.6、SQLite 3.8.8、SQL Server 2017支持配置使用多種緩存驅動&#xff…

車聯網軟件定義汽車安全攻擊示例

目錄 導言 名詞解釋 TBox QNX介紹 ADB 威脅分析

Flameshot的安裝、配置及使用

概要:本篇主要介紹在Ubuntu22.04環境下,截圖軟件Flameshot的安裝、配置及使用。 一、安裝 推薦命令行安裝 sudo apt install flameshot 二、修改gdm3配置文件 這一步是為了解決截圖時沒有光標的問題,解決方法我是從這里學到的解決flam…

【hugging face】bitsandbytes中8 bit量化的理解

8 位量化使數十億參數規模的模型能夠適應更小的硬件,而不會降低性能。 8 位量化的工作原理如下: 1.從輸入隱藏狀態中按列提取較大值(離群值)。 2.對 FP16 中的離群值和 int8 中的非離群值執行矩陣乘法。 3.改變非異常值結果以將值…

unity中:搭建在線AR應用

使用Imagine WebAR - Image Tracker插件部署WebGL應用 在使用Imagine WebAR - Image Tracker插件進行WebGL應用開發時,有兩個關鍵知識點需要掌握: 1. 部署到支持HTTPS的服務器 由于WebGL應用需要訪問用戶的攝像頭,因此必須在支持HTTPS的服…

微前端 模塊聯邦技術

目錄 介紹 基本使用 演示用法 初始化配置文件 remote 項目 host 項目 為什么講這個呢,很多人覺得他不是微前端,也有人定義它也是微前端,看怎么理解了,我覺得他是一個去中心化技術,它可以讓多個獨立構建的應用…

【力扣100】9.和為k的子數組

添加鏈接描述 class Solution:def subarraySum(self, nums: List[int], k: int) -> int:# 思路是從第一個元素開始遍歷,加到爆,就把指針向前移一位result0for i in range(len(nums)):# 如果爆了,就向后移一位if i!len(nums)-1:ji1sumnums…

高并發爬蟲用Python語言適合嗎?

不管你用什么語言沒在進行高并發前,有幾點是需要考慮清楚的,;例如:數據集大小,算法、是否有時間和性能方面的制約,是否存在共享狀態,如何調試(這里指的是日志、跟蹤策略)…

C#云LIS系統源碼 B/S架構,SaaS模式,可擴展性強

基于B/S架構的云LIS檢驗系統源碼,整個系統的運行基于WEB層面,只需要在對應的工作臺安裝一個瀏覽器軟件有外網即可訪問。全套系統采用云部署模式,部署一套可支持多家醫院檢驗科共同使用。 采用.Net Core新的技術框架、DEV報表、前端js封裝、分…

騰訊云CentOS8 jenkins war安裝jenkins步驟文檔

騰訊云CentOS8 jenkins war安裝jenkins步驟文檔 一、安裝jdk 1.1 上傳jdk-11.0.20_linux-x64_bin.tar.gz 1.2 解壓jdk安裝包文件 tar -zxvf jdk*.tar.gz 1.3 在/usr/local 目錄下創建java目錄 cd /usr/local mkdir java 1.4 切到java目錄,把jdk解壓文件改名為jd…

【抽象策略模式】實踐

前言 剛果商城,用戶登錄 Or 注冊 發送郵箱驗證碼場景,使用抽象策略模式實現 什么是抽象策略模式 抽象策略模式是一種行為型設計模式,它允許定義一系列算法,將每個算法封裝起來,并使它們可以互相替換。這使得客戶端代碼…

Java_LinkedList鏈表詳解

目錄 前言 ArrayList的缺陷 鏈表 鏈表的概念及結構 鏈表的種類 1.單向或雙向 2.帶頭或不帶頭 3.循環或不循環 LinkedList的使用 什么是LinkedList LinkedList的使用 LinkedList的構造 LinkedList的其他常用方法介紹 LinkedList的遍歷 ArrayList和LinkedList的…

OpenCL學習筆記(四)手動編譯開發庫(ubuntu+gcc+rk3588)

前言 筆者本次使用的是RK3588的開發板,內部燒寫的是ubuntu20.04,gcc版本是9 本文檔簡單記錄下編譯的過程,有需要的小伙伴可以參考下 一、安裝所需軟件 1.安裝git,教程比較多,不再重復 2.安裝cmake,教程…

UWB的matlab仿真源碼

作品詳細文章與下載鏈接 第一部分:TR-UWB信號的產生和調制 簡介 該實踐涉及使用 MATLAB 生成和調制 TR-UWB 信號。超寬帶信號是一類在頻譜中具有寬帶而不是窄帶的信號信號,具有時間寬度的脈沖產生它。在本次實踐中,MATLAB 程序是開發用于生成基帶 TR-UWB 信號,我們用…

在Windows電腦上獲取硬盤ID的方法

如果你想在Windows電腦上獲取硬盤的ID,可以使用DiskPart命令。以下是具體步驟: 打開命令提示符 按下Win鍵R,輸入cmd,然后回車,即可打開命令提示符。 輸入diskpart并回車 在命令提示符中輸入diskpart,然后…

WordPress 注冊/重置密碼/更改密碼鉤子

wordpress在提供郵件提醒的地方都留了hook,方便讓開發者自定義。最新在添加第三方登錄時遇到虛擬郵箱發信問題,為了防止給指定郵件地址后綴發信,可以利用如下wordpress提供的鉤子來實現。 //https://www.wwttl.com/101.html //禁止用戶注冊時…