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 | 星期 | 星期一 |
| a | AM/PM | PM |
| Z | 時區 | +0800 |
對於高頻呼叫場景,避免重複建立 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 引入了 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"));
}
}
SimpleDateFormat 非執行緒安全,請勿作為 static 欄位共享,改用 ThreadLocal 或每次新建Calendar + StringBuffer 手動組裝或 DateTimeFormatter 重用ZoneId,避免伺服器時區導致的 Bug