NSDate和NSString轉換

weixin_34290000發表於2017-11-03

在我們專案中經常會接觸到時間等的轉換,將日期轉化成時間字串顯示,將時間字串轉化成日期等。

轉換方法

系統有提供NSString和NSDate之間的轉化方法。

//NSDate -> NSString
- (NSString *)stringFromDate:(NSDate *)date {
    //用於格式化NSDate物件
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    //設定顯示格式
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    //NSDate轉NSString
    NSString *dateString = [formatter stringFromDate:date];
    
    return dateString;
}

//NSString -> NSDate
- (NSDate *)dateFromString:(NSString *)dateString {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *date = [formatter dateFromString:dateString];
    
    return date;
}

這裡我們將兩個轉換各寫了一個方法,在專案裡我們可以封裝一個工具類,或者直接給NSDate寫分類來實現這兩個方法,以提供整個專案使用。

注意事項

0xx1

當我們用NSDate *currentDate = [NSDate date]時,獲取到的currentDate物件:

2056220-059458f95ea86ef1.png
NSDate.png

但是實際上我是在2017-11-03 19:44:58。也就是說用這個方法獲取到的currentDate物件是美國時間的NSDate物件。

但是轉換成NSString列印時:

2056220-a809de9c9e16c163.png
NSString.png

就是當地時間格式了。

0xx2

當我們將一個字串轉化成NSDate物件時,這個NSDate物件的日期將是美國當前日期時間

2056220-ad67667c6f4ffbb9.png
NSdate1.png

因為在與後臺傳輸過程中一般都是傳時間字串,所以當NSDate物件轉化成NSString後,時間就是當地時間,不會出現什麼時間上的誤差。

0xx3

如果想要解決上面的問題,就設定一下時區
//NSString -> NSDate
- (NSDate *)dateFromString:(NSString *)dateString {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:8]];
    NSDate *date = [formatter dateFromString:dateString];
    
    return date;
}
比較一下兩者的區別

未設定:

2056220-ec805b03a74adc5a.png
未設定時區.png

設定了:

2056220-b2b19cd018e06862.png
設定時區.png
總結

當地時間是2017-11-03 20:08:16。設定後獲取到的是當地時間的NSDate物件,沒設定的話是美國時間NSDate物件。

不過如果都轉化成字串進行處理的話就不會有什麼問題。

相關文章