NSString *dateStr = @"7/25/2013 12:00:00 AM";
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
[fmt setDateFormat:@"MM/dd/yyyy hh:mm:ss a"];
NSDate *date = [fmt dateFromString:dateStr];
NSLog(@"%@", date); // 輸出 2013-07-24 18:30:00 +0000 (少一天且時區偏移)
NSDateFormatter 預設使用**裝置當前時區**解析無時區資訊的字串。若輸入字串為當地時間(如美東時間),而裝置在 UTC+8,解析出的 NSDate(內部儲存 UTC)會產生時差,導致日期顯示偏移。
[fmt setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; // 或 [NSTimeZone timeZoneWithName:@"GMT"]
// 解析後的 NSDate 即為正確的 UTC 瞬間
NSString *dateStr = @"7/25/2013 12:00:00 AM";
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
[fmt setDateFormat:@"MM/dd/yyyy hh:mm:ss a"];
[fmt setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; // 關鍵行
NSDate *date = [fmt dateFromString:dateStr];
NSLog(@"dateStr: %@, date: %@", dateStr, date);
// 輸出: dateStr: 7/25/2013 12:00:00 AM, date: 2013-07-25 04:00:00 +0000 (正確 UTC)
let dateStr = "7/25/2013 12:00:00 AM"
let fmt = DateFormatter()
fmt.dateFormat = "MM/dd/yyyy hh:mm:ss a"
fmt.timeZone = TimeZone(secondsFromGMT: 0) // 或 TimeZone(abbreviation: "GMT")
if let date = fmt.date(from: dateStr) {
print("date: \(date)") // 2013-07-25 04:00:00 +0000
}
// 解析時用 GMT,儲存 NSDate
// 顯示時轉換為用戶當地時區
let displayFormatter = DateFormatter()
displayFormatter.dateFormat = "yyyy-MM-dd HH:mm"
displayFormatter.timeZone = TimeZone.current // 或指定 TimeZone(identifier: "Asia/Taipei")
let displayStr = displayFormatter.string(from: date)
timeZone,否則預設裝置時區導致偏移。NSDate/Date 本身無時區概念,僅代表絕對時間點。加上 setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0] 即可徹底解決日期偏移問題。