// 錯誤:直接用目標格式解析源字串
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd hh:mm:ss a"]; // 目標格式
NSDate *date = [df dateFromString:@"Sun, 16 Dec 2012 15:30:22 +0000"]; // 返回 nil
格式化器的 dateFormat 必須**完全匹配輸入字串格式**才能解析成功。
dateFormat 匹配**輸入字串**,調用 dateFromString: 獲得 NSDate。dateFormat 為**目標輸出格式**,調用 stringFromDate: 獲得字串。
NSString *input = @"Sun, 16 Dec 2012 15:30:22 +0000";
// 步驟 1:解析
NSDateFormatter *parser = [[NSDateFormatter alloc] init];
parser.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; // 關鍵:固定 locale 解析月份縮寫
parser.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss Z"; // 匹配輸入格式
NSDate *date = [parser dateFromString:input];
// 步驟 2:格式化(按需求輸出)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; // 目標格式
NSString *output = [formatter stringFromDate:date];
// output: @"2012-12-16 15:30:22"
| 輸入片段 | 格式符號 | 說明 |
|---|---|---|
| Sun | EEE | 星期縮寫 |
| 16 | dd | 兩位日期 |
| Dec | MMM | 月份縮寫 |
| 2012 | yyyy | 四位年份 |
| 15:30:22 | HH:mm:ss | 24制時間 |
| +0000 | Z | RFC 822 時區 |
locale = en_US_POSIX:防止系統語言導致月份/星期解析失敗(如中文環境 "Dec" 解析失敗)。
let input = "Sun, 16 Dec 2012 15:30:22 +0000"
let parser = DateFormatter()
parser.locale = Locale(identifier: "en_US_POSIX")
parser.dateFormat = "EEE, dd MMM yyyy HH:mm:ss Z"
guard let date = parser.date(from: input) else { return }
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let output = formatter.string(from: date)
print(output) // 2012-12-16 15:30:22
日期字串轉換**必須分兩步**:dateFromString (匹配源格式) → stringFromDate (輸出目標格式)。核心陷阱:locale 未固定導致月份/星期解析失敗,dateFormat 混用源/目標格式導致返回 nil。