SimpleDateFormat 和 DateTimeFormatter 的異同

在Java開發中Date類型轉String類型是比較常見的,其中最常用的是以下幾種方式:

1. 使用SimpleDateFormat(Java 8之前)

import java.text.SimpleDateFormat;
import java.util.Date;public class DateToStringExample {public static void main(String[] args) {Date date = new Date();// 創建日期格式化對象SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期為字符串String dateString = sdf.format(date);System.out.println("格式化后的日期: " + dateString);}
}

2. 使用DateTimeFormatter(Java 8及以后)?

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;public class DateToStringJava8 {public static void main(String[] args) {Date date = new Date();// 將Date轉換為LocalDateTimeLocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();// 定義格式化模式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 格式化String dateString = localDateTime.format(formatter);System.out.println("格式化后的日期: " + dateString);}
}

擴展:?

常用的日期格式模式

  • yyyy:四位年份
  • MM:兩位月份(01-12)
  • dd:兩位日期(01-31)
  • HH:24小時制的小時(00-23)
  • hh:12小時制的小時(01-12)
  • mm:分鐘(00-59)
  • ss:秒(00-59)
  • SSS:毫秒(000-999)
  • a:上午/下午標記(AM/PM)

注:需要注意的這兩種方式雖然都可以實現需求,但是兩種方式還是有比較明顯的區別的

1. 所屬 API 體系不同

  • ?SimpleDateFormat?:

    • 屬于舊的?java.text?包
    • 配合?java.util.Date?和?java.util.Calendar?使用
    • Java 1.1 引入
  • ?DateTimeFormatter?:

    • 屬于新的?java.time.format?包
    • 配合 Java 8 引入的?java.time?API (LocalDate,?LocalDateTime?等)使用
    • Java 8 引入

SimpleDateFormat 和 DateTimeFormatter 的區別

SimpleDateFormat?和?DateTimeFormatter?都是 Java 中用于日期時間格式化的類,但它們屬于不同的 API 體系,有顯著的區別:

1. 所屬 API 體系不同

  • ?SimpleDateFormat?:

    • 屬于舊的?java.text?包
    • 配合?java.util.Date?和?java.util.Calendar?使用
    • Java 1.1 引入
  • ?DateTimeFormatter?:

    • 屬于新的?java.time.format?包
    • 配合 Java 8 引入的?java.time?API (LocalDate,?LocalDateTime?等)使用
    • Java 8 引入

2. 線程安全性(尤其需要注意,面試會問)

  • ?SimpleDateFormat?:

    • ?不是線程安全的?
    • 多線程環境下需要同步或為每個線程創建獨立實例
  • ?DateTimeFormatter?:

    • ?線程安全?
    • 可以安全地在多線程環境中共享實例

3.功能差異

  • ?DateTimeFormatter? 提供更多功能:
    • 內置預定義的格式化器 (如?ISO_LOCAL_DATE)
    • 更好的本地化支持
    • 更靈活的解析和格式化選項
    • 支持解析到?TemporalAccessor?而不僅僅是特定類型

4. 異常處理

  • ?SimpleDateFormat?:

    • 解析失敗時通常返回錯誤結果而不是拋出異常
    • 行為有時不一致
  • ?DateTimeFormatter?:

    • 解析失敗時拋出?DateTimeParseException
    • 行為更加嚴格和一致

5. 性能

  • ?DateTimeFormatter? 通常性能更好,特別是在多線程環境中

SimpleDateFormat 和 DateTimeFormatter 的區別

SimpleDateFormat?和?DateTimeFormatter?都是 Java 中用于日期時間格式化的類,但它們屬于不同的 API 體系,有顯著的區別:

1. 所屬 API 體系不同

  • ?SimpleDateFormat?:

    • 屬于舊的?java.text?包
    • 配合?java.util.Date?和?java.util.Calendar?使用
    • Java 1.1 引入
  • ?DateTimeFormatter?:

    • 屬于新的?java.time.format?包
    • 配合 Java 8 引入的?java.time?API (LocalDate,?LocalDateTime?等)使用
    • Java 8 引入

2. 線程安全性

  • ?SimpleDateFormat?:

    • ?不是線程安全的?
    • 多線程環境下需要同步或為每個線程創建獨立實例
  • ?DateTimeFormatter?:

    • ?線程安全?
    • 可以安全地在多線程環境中共享實例

3. 功能差異

  • ?DateTimeFormatter? 提供更多功能:
    • 內置預定義的格式化器 (如?ISO_LOCAL_DATE)
    • 更好的本地化支持
    • 更靈活的解析和格式化選項
    • 支持解析到?TemporalAccessor?而不僅僅是特定類型

4. 異常處理

  • ?SimpleDateFormat?:

    • 解析失敗時通常返回錯誤結果而不是拋出異常
    • 行為有時不一致
  • ?DateTimeFormatter?:

    • 解析失敗時拋出?DateTimeParseException
    • 行為更加嚴格和一致

5. 性能

  • ?DateTimeFormatter? 通常性能更好,特別是在多線程環境中

6. 使用示例對比

// SimpleDateFormat 示例
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formatted = sdf.format(new Date());
Date parsed = sdf.parse("2023-11-15");// DateTimeFormatter 示例
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formatted = LocalDate.now().format(dtf);
LocalDate parsed = LocalDate.parse("2023-11-15", dtf);

何時使用哪個?

  • ?使用 SimpleDateFormat?:

    • 維護舊代碼
    • 必須與?java.util.Date?交互
    • 項目不能使用 Java 8+
  • ?使用 DateTimeFormatter?:

    • 新開發項目
    • 需要線程安全
    • 需要更好的API設計和功能
    • 可以使用 Java 8+

總結

DateTimeFormatter?是更現代、更安全、功能更強大的選擇,而?SimpleDateFormat?主要是為了向后兼容而保留。如果使用 Java 8 或更高版本,強烈建議使用新的?java.time?API 和?DateTimeFormatter

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

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

相關文章

《前端面試題:CSS對瀏覽器兼容性》

CSS瀏覽器兼容性完全指南:從原理到實戰 跨瀏覽器兼容性是前端開發的核心挑戰,也是面試中的高頻考點。查看所有css屬性對各個瀏覽器兼容網站:https://caniuse.com 一、瀏覽器兼容性為何如此重要? 在當今多瀏覽器生態中&#xff0c…

【stm32開發板】單片機最小系統原理圖設計

一、批量添加網絡標簽 可以選擇浮動工具中的N,單獨為引腳添加網絡標簽。 當芯片引腳非常多的時候,選中芯片,右鍵選擇扇出網絡標簽/非連接標識 按住ctrl鍵即可選中多個引腳 點擊將引腳名稱填入網絡名 就完成了引腳標簽的批量添加 二、電源引…

golang連接sm3認證加密(app)

文章目錄 環境文檔用途詳細信息 環境 系統平臺:Linux x86-64 Red Hat Enterprise Linux 7 版本:4.5 文檔用途 golang連接安全版sm3認證加密數據庫,驅動程序詳見附件。 詳細信息 1.下載Linux golang安裝包 go1.17.3.linux-amd64.tar.gz 1.1. 解壓安…

node實例應用

打開vscode,創建node項目,直接進入一個干凈的文件夾,打開控制臺 一 項目初始化 1. 初始化包管理 npm init -y2. 安裝express npm install express4.17.1 3. 根目錄下創建app.js,引入express // 引入expree const express require(express)// 創建實例 const …

Springboot——整合websocket并根據type區別處理

文章目錄 前言架構思想項目結構代碼實現依賴引入自定義注解定義具體的處理類定義 TypeAWebSocketHandler定義 TypeBWebSocketHandler 定義路由處理類配置類,綁定point制定前端頁面編寫測試接口方便跳轉進入前端頁面 測試驗證結語 前言 之前寫過一篇類似的博客&…

vscode命令行debug

vscode命令行debug 一般命令行debug會在遠程連服務器的時候用上,命令行debug的本質是在執行時暴露一個監聽端口,通過進入這個端口,像本地調試一樣進行。 這里提供兩種方式: 直接在命令行中添加debugpy,適用于python…

Hot100 Day02(移動0,乘最多水的容器、三數之和、接雨水)

移動零 題目鏈接 題目描述: 思路:上述藍色箭頭代表當前遍歷的元素,紅色數字則是當前空位0的位置,每一次遇到非0元素,就是講該元素的位置和空位0的位置進行交換,同時空位0的下標1. 代碼 class Solution …

(eNSP)配置WDS手拉手業務

1.實驗拓撲 2.基礎配置 [SW1]dis cu # sysname SW1 # vlan batch 10 100 110 120 # dhcp enable # interface Vlanif10ip address 192.168.10.2 255.255.255.0 # interface Vlanif100ip address 192.168.100.2 255.255.255.0dhcp select interfacedhcp server excluded-ip-add…

lua的筆記記錄

類似python的eval和exec 可以偽裝成其他格式的文件,比如.dll 希望在異常發生時,能夠讓其沉默,即異常捕獲。而在 Lua 中實現異常捕獲的話,需要使用函數 pcall,假設要執行一段 Lua 代碼并捕獲里面出現的所有錯誤&#xf…

【DeepSeek】【Dify】:用 Dify 對話流+標題關鍵詞注入,讓 RAG 準確率飛躍

1 構建對話流處理數據 初始準備 文章大綱摘要 數據標注和清洗 代碼執行 特別注解 2 對話流測試 準備工作 大綱生成 清洗片段 整合分段 3 構建知識庫 構建 召回測試 4 實戰應用測試 關鍵詞提取 智能總結 測試 1 構建對話流處理數據 初始準備 構建對話變量 用…

RabbitMQ 開機啟動配置教程

RabbitMQ 開機啟動配置教程 在本教程中,我們將詳細介紹如何配置 RabbitMQ 以實現開機自動啟動。此配置適用于手動安裝的 RabbitMQ 版本。 環境準備 操作系統:CentOS 7RabbitMQ 版本:3.8.4Erlang 版本:21.3 步驟 1. 安裝 Erla…

第N1周:one-hot編碼案例

🍨 本文為🔗365天深度學習訓練營中的學習記錄博客 🍖 原作者:K同學啊 一、one-hot編碼概念 自然語言處理(NLP)中的文本數字化:文字對于計算機來說就僅僅只是一個個符號,計算…

Linux 云服務器部署 Flask 項目(含后臺運行與 systemd 開機自啟)

一、準備工作 在開始正式部署之前,請確認以下前提條件已經準備好: 你有一臺運行 Linux 系統(CentOS 或 Ubuntu)的服務器; 服務器有公網 IP,本例中使用:111.229.204.102; 你擁有該服務器的管理員權限(可以使用 sudo); 打算使用 Flask 構建一個簡單的 Web 接口; 服務…

散貨拼柜業務:多貨主財務結算如何高效管理?

散貨拼柜業務滿足了小批量發貨客戶的需求,由于無法滿足海運整柜的條件,其模式通常涉及多個貨主共同分攤同一集裝箱的運輸項目。這種業務模型雖然在成本上具備優勢,但其復雜的財務結算過程往往給公司帶來了挑戰。 散貨拼柜業務的特點在于其小…

數據結構(7)—— 二叉樹(1)

目錄 前言 一、 樹概念及結構 1.1樹的概念 1.2樹的相關概念 1.3數的表示 1.二叉樹表示 2.孩子兄弟表示法 3.動態數組存儲 1.4樹的實際應用 二、二叉樹概念及結構 2.1概念 2.2特殊的二叉樹 1.滿二叉樹 2. 完全二叉樹 2.3二叉樹的性質 2.4二叉樹的存儲結構 1.順序存儲 2.鏈式存儲…

SpringBoot+Vue+微信小程序校園自助打印系統

概述?? 校園自助打印系統是現代化校園建設中不可或缺的一部分,基于SpringBootVue微信小程序開發的??免費Java源碼??項目,包含完整的用戶預約、打印店管理等功能模塊。 ??主要內容?? ?? 系統功能模塊?? ??登錄驗證模塊??:…

使用 useSearchParams 的一個沒有觸發控制臺報錯的錯誤用法

const searchParams useSearchParams(); // navigate(/?${searchParams.toString()});//帶過去的參數會把函數方法也帶過去 正確寫法應該是用[]解構 使用了數組解構(destructuring)來提取 useSearchParams 返回的數組中的第一個值 const [searchPara…

Blender的一些設置

1. 將Blender長度單位改為毫米(mm), 并設置guides Grid的縮放系數,避免網格不見了。 2. 布爾操作的(Apply)應用按鈕在哪里?好吧,在這里: 可以按下 CTRL A 快捷鍵。 3. 模型的 移動、旋轉、縮放快捷鍵: G,R&#xff0…

Inno Setup 腳本中常用術語釋義

1、目錄常量 {app} 應用程序所在的目錄。 {win} 系統的 Windows 目錄, “C:/WINDOWS”。 {sys} 系統的 Windows 系統(System)目錄,“C:/WINDOWS/SYSTEM”。 {src} 這個文件夾指向安裝程序所在的位置。 {pf} 程序…

【java面試】MySQL篇

MySQL篇 一、總體結構二、優化(一)定位慢查詢1.1 開源工具1.2Mysql自帶的慢日志查詢1.3 總結 (二)定位后優化2.1 優化2.2 總結 (三)索引3.1 索引3.2 索引底層數據結構——B樹3.3 總結 (四&#…