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

iOS NSDateFormatter 日期字串解析為 NSDate 的兩步走策略:先解析後格式化

     編輯:程式設計綜合問答

常見錯誤


// 錯誤:直接用目標格式解析源字串
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 必須**完全匹配輸入字串格式**才能解析成功。

正確兩步走

  1. 解析:設置 dateFormat 匹配**輸入字串**,調用 dateFromString: 獲得 NSDate。
  2. 格式化:重置 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"

格式符號對照(輸入字串對應)

輸入片段格式符號說明
SunEEE星期縮寫
16dd兩位日期
DecMMM月份縮寫
2012yyyy四位年份
15:30:22HH:mm:ss24制時間
+0000ZRFC 822 時區

關鍵最佳實踐

  • 固定 locale = en_US_POSIX:防止系統語言導致月份/星期解析失敗(如中文環境 "Dec" 解析失敗)。
  • 解析與格式化分離:使用兩個 Formatter 實例,避免格式衝突、線程不安全。
  • 緩存 Formatter:創建開銷大,建議單例或靜態常量復用。

Swift 版本


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。

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