2015年10月7日

Xcode iOS ObjectiveC 下的 NSDateFormatter 日期時間

一般時間日期會用以下的程式碼來取得:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm"];
NSString *todayStr = [dateFormatter stringFromDate:[NSDate date]];

但,如果你的程式若有牽涉到用時間日期來做資料擷取、認證等問題時,就有些東西要注意了。

比如,就我的例子可能手機大都用台灣時間,加上伺服器也調成台灣時間的話,自己測試的話,就當然很順,但如果使用者手機設不是台灣時間呢?那時間就會對不起來了。

解決的方法就是手機在算時間日期時,加上 timeZone,
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Taipei"]];
[dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm"];
NSString *todayStr = [dateFormatter stringFromDate:[NSDate date]];

另外,可能一般會比較沒注意到,試著將「西曆」改設定成「日本曆」,這時 dateFormat 的 yyyy 會回傳 0027,而不是西元的 2015! 這代表在日本曆的「平成27年」。

解決的方法就是設定西曆 (NSGregorianCalendar),完整的日期時間取得的程式碼就是如下了。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Taipei"]];
[dateFormatter setCalendar: [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]];
[dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm"];
NSString *todayStr = [dateFormatter stringFromDate:[NSDate date]];


呼~會整死人的啊,在這之前,壓根不知外國人若設成其他非西曆者,根本不能用啊... >"<

Orignal From: Xcode iOS ObjectiveC 下的 NSDateFormatter 日期時間