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

Java 日期格式化完全指南:SimpleDateFormat 與 Calendar 進階應用

     編輯:Java 綜合教學

SimpleDateFormat:標準格式化工具

java.text.SimpleDateFormat 是 Java 早期版本核心的日期格式化類,支援豐富的模式字元:

基本用法

import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatDemo {
    public static void main(String[] args) {
        Date now = new Date();
        
        // 定義不同格式
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒SSS毫秒");
        SimpleDateFormat sdf3 = new SimpleDateFormat("yyyyMMddHHmmssSSS"); // 時間戳格式
        
        System.out.println("預設格式: " + now);
        System.out.println("英文格式: " + sdf1.format(now));
        System.out.println("中文格式: " + sdf2.format(now));
        System.out.println("時間戳:   " + sdf3.format(now));
    }
}

常用模式字元對照表

字元含義範例
y年2024
M月07
d日15
H時 (0-23)14
h時 (1-12)02
m分30
s秒59
S毫秒123
E星期星期一
aAM/PMPM
Z時區+0800

Calendar + StringBuffer:高效能客製化格式化

對於高頻呼叫場景,避免重複建立 SimpleDateFormat 物件(非執行緒安全),可使用 Calendar 搭配 StringBuffer 手動組裝:

import java.util.Calendar;
import java.util.GregorianCalendar;

class DateTime {
    private Calendar calendar = new GregorianCalendar();
    
    // 統一格式:yyyy-MM-dd HH:mm:ss.SSS
    public String getDate() {
        StringBuffer buf = new StringBuffer();
        buf.append(padZero(calendar.get(Calendar.YEAR), 4)).append("-");
        buf.append(padZero(calendar.get(Calendar.MONTH) + 1, 2)).append("-");
        buf.append(padZero(calendar.get(Calendar.DAY_OF_MONTH), 2)).append(" ");
        buf.append(padZero(calendar.get(Calendar.HOUR_OF_DAY), 2)).append(":");
        buf.append(padZero(calendar.get(Calendar.MINUTE), 2)).append(":");
        buf.append(padZero(calendar.get(Calendar.SECOND), 2)).append(".");
        buf.append(padZero(calendar.get(Calendar.MILLISECOND), 3));
        return buf.toString();
    }
    
    // 中文完整格式
    public String getDateComplete() {
        StringBuffer buf = new StringBuffer();
        buf.append(calendar.get(Calendar.YEAR)).append("年");
        buf.append(padZero(calendar.get(Calendar.MONTH) + 1, 2)).append("月");
        buf.append(padZero(calendar.get(Calendar.DAY_OF_MONTH), 2)).append("日 ");
        buf.append(padZero(calendar.get(Calendar.HOUR_OF_DAY), 2)).append("時");
        buf.append(padZero(calendar.get(Calendar.MINUTE), 2)).append("分");
        buf.append(padZero(calendar.get(Calendar.SECOND), 2)).append("秒");
        buf.append(padZero(calendar.get(Calendar.MILLISECOND), 3)).append("毫秒");
        return buf.toString();
    }
    
    // 時間戳:yyyyMMddHHmmssSSS
    public String getTimeStamp() {
        StringBuffer buf = new StringBuffer();
        buf.append(calendar.get(Calendar.YEAR));
        buf.append(padZero(calendar.get(Calendar.MONTH) + 1, 2));
        buf.append(padZero(calendar.get(Calendar.DAY_OF_MONTH), 2));
        buf.append(padZero(calendar.get(Calendar.HOUR_OF_DAY), 2));
        buf.append(padZero(calendar.get(Calendar.MINUTE), 2));
        buf.append(padZero(calendar.get(Calendar.SECOND), 2));
        buf.append(padZero(calendar.get(Calendar.MILLISECOND), 3));
        return buf.toString();
    }
    
    // 補零工具方法
    private String padZero(int num, int len) {
        StringBuffer s = new StringBuffer().append(num);
        while (s.length() < len) s.insert(0, "0");
        return s.toString();
    }
}

現代化替代方案:Java 8+ Date Time API

Java 8 引入了 java.time 套件,提供執行緒安全、不可變、API 更豐富的替代品:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.ZoneId;
import java.util.Locale;

public class ModernDateFormat {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        
        // 預定義格式
        System.out.println("ISO 格式: " + now.format(DateTimeFormatter.ISO_DATE_TIME));
        
        // 自訂格式
        DateTimeFormatter chinese = DateTimeFormatter
            .ofPattern("yyyy年MM月dd日 HH時mm分ss秒")
            .withLocale(Locale.TRADITIONAL_CHINESE);
        System.out.println("中文格式: " + now.format(chinese));
        
        // 解析字串
        LocalDateTime parsed = LocalDateTime.parse("2024-07-15 14:30:00", 
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
}

最佳實踐建議

  1. 新專案優先使用 java.time:執行緒安全、API 直觀、功能強大
  2. 舊專案維護:SimpleDateFormat 非執行緒安全,請勿作為 static 欄位共享,改用 ThreadLocal 或每次新建
  3. 高效能場景:考慮 Calendar + StringBuffer 手動組裝或 DateTimeFormatter 重用
  4. 時區處理:務必明確指定 ZoneId,避免伺服器時區導致的 Bug
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved