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

iOS NSDateFormatter 日期格式轉換錯誤:HH vs hh 導致 12/24 小時制混淆

     編輯:程式設計綜合問答

問題重現

輸入字串 2013-03-14 17:35:00 +0000,使用格式 MM/dd/yyyy hh:mm:ss 解析後輸出為 03/14/2013 05:35:00,小時從 17 變為 05。

根本原因

  • hh 代表 **12 小時制**(1-12),需配合 a (AM/PM) 使用。
  • HH 代表 **24 小時制**(0-23),直接對應 17:35。
  • 原字串為 24 制,解析時用 hh 導致 17 被誤讀為 05 (PM),格式化輸出時無 AM/PM 標識顯示為 05。

修正代碼

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 解析階段:匹配原字串格式(24 制 + 時區)
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; // Z 對應 +0000
NSDate *date = [formatter dateFromString:@"2013-03-14 17:35:00 +0000"];

// 格式化階段:按需求輸出(如 24 制)
[formatter setDateFormat:@"MM/dd/yyyy HH:mm:ss"];
NSString *result = [formatter stringFromDate:date];
// 結果:03/14/2013 17:35:00

常用格式符號速查表

符號含義範例
yyyy年(4 位)2013
MM月(2 位)03
dd日(2 位)14
HH時(24 制,0-23)17
hh時(12 制,1-12)05
mm分35
ss秒00
aAM/PM 標識PM
Z時區偏移(RFC 822)+0000

最佳實踐建議

  1. 解析與格式化分離:用兩個 formatter 或重置格式,避免混淆。
  2. 固定 Locale:formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; 確保月份名稱等不受系統語言影響。
  3. 時區處理:解析時指定 formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; 若需統一按 UTC 解析。
  4. 緩存 Formatter:NSDateFormatter 創建開銷大,建議靜態單例或池化復用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved