API 返回 ISO 8601 格式日期字串 2013-09-06T14:15:11.557,需轉為 2013 Sept 06 02:15。關鍵在於正確解析帶毫秒的 ISO 格式,再用目標模式格式化。
// 常量定義錯誤:缺少 T、時間、毫秒
public static final String DATE_FORMAT_WITHOUT_TIME = "yyyy-MM-dd";
// 解析會拋出 ParseException
Date date = df.parse("2013-09-06T14:15:11.557");
SimpleDateFormat 模式必須完全匹配輸入字串結構。
| 輸入字串 | 正確模式 |
|---|---|
2013-09-06T14:15:11.557 | yyyy-MM-dd'T'HH:mm:ss.SSS |
2013-09-06T14:15:11 | yyyy-MM-dd'T'HH:mm:ss |
2013-09-06 | yyyy-MM-dd |
'T':單引號包裹字面字元 THH:24 小時制SSS:毫秒(3 位)
import java.text.*;
import java.util.*;
public class DateConvert {
public static void main(String[] args) throws ParseException {
String input = "2013-09-06T14:15:11.557";
// 1. 解析:模式完全匹配輸入
DateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
Date date = parser.parse(input);
// 2. 格式化:目標模式
DateFormat formatter = new SimpleDateFormat("yyyy-MMM-dd hh:mm", Locale.ENGLISH);
// MMM = 縮寫月份 (Sept),hh = 12小時制
String output = formatter.format(date);
System.out.println(output); // 2013-Sept-06 02:15
}
}
2013-Sept-06 02:15
import java.time.*;
import java.time.format.*;
String input = "2013-09-06T14:15:11.557";
LocalDateTime ldt = LocalDateTime.parse(input, DateTimeFormatter.ISO_DATE_TIME);
// 或自定義:DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
String output = ldt.format(DateTimeFormatter.ofPattern("yyyy-MMM-dd hh:mm", Locale.ENGLISH));
System.out.println(output); // 2013-Sept-06 02:15
優點:線程安全、不可變、API 更清晰、無需處理 ParseException。
MMM 月份縮寫依賴 Locale,中文環境輸出「9月」,須指定 Locale.ENGLISHhh 12小時制 (01-12),HH 24小時制 (00-23)SimpleDateFormat 非線程安全,多線程環境用 ThreadLocal 或 Java 8 DateTimeFormatterISO 8601 解析關鍵是模式 yyyy-MM-dd'T'HH:mm:ss.SSS 精確匹配 T 與毫秒。格式化時指定 Locale.ENGLISH 獲得英文月份縮寫。新專案優先用 Java 8 java.time 包。