首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java String.format 日期格式化完全指南:Locale 與模式字元實戰

     編輯:Java 程式設計入門

前言

String.format() 配合 %t 前綴提供了強大的日期時間格式化能力,且原生支援 Locale 多語系輸出。不同於 SimpleDateFormat 需實例化模式字串,String.format 採用類 C 的格式化語法,程式碼更簡潔、可讀性更高。本文詳細說明常用模式字元、Locale 影響與實戰範例。

核心語法

String formatted = String.format(locale, formatString, dateArgument);
  • locale:決定月份/星期名稱語言(如 Locale.US、Locale.TAIWAN),預設為系統預設 Locale。
  • formatString:包含一或多個 %tX 模式字元,X 為具體格式代碼。
  • dateArgument:java.util.Date、Calendar、Long(毫秒時間戳)或 TemporalAccessor 實作。

常用日期模式字元對照表

代碼說明範例 (Locale.US)範例 (Locale.TAIWAN)
%tY四位數年份20242024
%ty兩位數年份2424
%tB月份全名January一月
%tb月份縮寫Jan1月
%tm兩位數月份0101
%td兩位數日期1515
%te日期(不補零)1515
%tA星期全名Monday星期一
%ta星期縮寫Mon週一
%tH24小時制時(00-23)1414
%tI12小時制時(01-12)0202
%tM分鐘(00-59)3030
%tS秒數(00-59)4545
%tpAM/PM 標記PM下午
%tR時間 %tH:%tM14:3014:30
%tT時間 %tH:%tM:%tS14:30:4514:30:45
%tc完整日期時間 %ta %tb %td %tT %tZ %tYMon Jan 15 14:30:45 CST 2024週一 1月 15 14:30:45 CST 2024
%tFISO 日期 %tY-%tm-%td2024-01-152024-01-15
%tD美式日期 %tm/%td/%ty01/15/2401/15/24

完整範例程式碼

import java.util.Date;
import java.util.Locale;

public class DateFormatDemo {
    public static void main(String[] args) {
        Date now = new Date();

        System.out.println("=== 基本日期元件 ===");
        System.out.printf(Locale.US, "年份(4位): %tY%n", now);
        System.out.printf(Locale.US, "年份(2位): %ty%n", now);
        System.out.printf(Locale.US, "月份全名: %tB%n", now);
        System.out.printf(Locale.US, "月份縮寫: %tb%n", now);
        System.out.printf(Locale.US, "月份(2位): %tm%n", now);
        System.out.printf(Locale.US, "日期(2位): %td%n", now);
        System.out.printf(Locale.US, "日期(不補零): %te%n", now);

        System.out.println("\n=== 星期資訊 ===");
        System.out.printf(Locale.US, "星期全名: %tA%n", now);
        System.out.printf(Locale.US, "星期縮寫: %ta%n", now);
        System.out.printf(Locale.TAIWAN, "繁體中文星期: %tA%n", now);
        System.out.printf(Locale.TAIWAN, "繁體中文縮寫: %ta%n", now);

        System.out.println("\n=== 時間元件 ===");
        System.out.printf("24小時制: %tH%n", now);
        System.out.printf("12小時制: %tI%n", now);
        System.out.printf("分鐘: %tM%n", now);
        System.out.printf("秒數: %tS%n", now);
        System.out.printf("AM/PM: %tp%n", now);

        System.out.println("\n=== 組合格式 ===");
        System.out.printf("ISO 日期: %tF%n", now);           // 2024-01-15
        System.out.printf("美式日期: %tD%n", now);           // 01/15/24
        System.out.printf("時間 HH:MM: %tR%n", now);         // 14:30
        System.out.printf("時間 HH:MM:SS: %tT%n", now);      // 14:30:45
        System.out.printf("完整日期時間: %tc%n", now);       // Mon Jan 15 14:30:45 CST 2024

        System.out.println("\n=== 自訂組合:中文完整日期 ===");
        String chineseDate = String.format(Locale.TAIWAN, "%tY年%tm月%td日 %tA", now, now, now, now);
        System.out.println(chineseDate); // 2024年01月15日 星期一
    }
}

進階技巧

1. 同一參數多次使用:引數索引

格式字串中可用 %1$tY、%1$tm 等引用同一個日期參數,避免重複傳遞:

String custom = String.format(Locale.TAIWAN, "%1$tY年%1$tm月%1$td日 %1$tA", now);
// 2024年01月15日 星期一

2. 直接格式化時間戳

無需建立 Date 物件,直接傳入 long 毫秒數:

long ts = System.currentTimeMillis();
String iso = String.format("%tF %tT", ts, ts); // 2024-01-15 14:30:45

3. 格式化 Calendar / ZonedDateTime

Calendar cal = Calendar.getInstance();
System.out.printf("%tF", cal); // 支援

// Java 8+ TemporalAccessor
ZonedDateTime zdt = ZonedDateTime.now();
System.out.printf("%tF %tT", zdt, zdt); // 支援

常見坑點與最佳實踐

  • 執行緒安全:String.format 內部使用 Formatter,每次呼叫建立新實例,天然執行緒安全,優於 SimpleDateFormat。
  • 效能考量:高頻呼叫(如日誌每秒萬次)建議改用 DateTimeFormatter(Java 8+)並預編譯,效能提升 3-5 倍。
  • Locale 為 null 時:會拋出 NullPointerException,請改用 Locale.getDefault() 或明確指定。
  • %te 與 %td 差異:前者不補零(1-31),後者補零(01-31),中文環境下輸出相同但英文環境下 %te 可能含前導空格。

總結

String.format() 的日期格式化語法簡潔且功能完整,特別適合:

  1. 簡單的單行格式化需求
  2. 多語系輸出(配合 Locale)
  3. 不想引入額外依賴的輕量專案

對於複雜解析、高效能序列化、時區運算等進階場景,請優先使用 Java 8+ java.time 套件(DateTimeFormatter、ZonedDateTime 等)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved