2013-03-14 108 views
0

下面是一個字符串表示的日期解析日期,目標C

NSString *dateStr = @"2011-07-06"; 

,當我試圖做它的NSDate轉換爲

NSDateFormatter *format   = [[NSDateFormatter alloc] init]; 

    [format setDateFormat:@"yyyy-MM-dd"]; 
    NSDate  *tmp    = [format dateFromString:dateStr]; 
    NSLog(@"tmp is %@",[tmp description]); 

我我從控制檯得到是

tmp is 2011-07-06 04:00:00 +0000 

我不明白爲什麼我越來越extr一個信息:04:00:00 +0000的結果

請幫助,如果你

回答

2

代碼之前經歷過

NSString *dateStr = @"2011-07-06"; 
NSDateFormatter *format   = [[NSDateFormatter alloc] init]; 

[format setDateFormat:@"yyyy-MM-dd"]; 
NSDate  *tmp    = [format dateFromString:dateStr] 

將導致的NSDate對象,表示您的本地時間0:00 - 開始的一天。

但是,如果您打印一個普通的日期對象,它將產生一個表示格林尼治標準時間的時間的字符串,因爲內部所有日期都被歸一化爲該時區。

由於你的字符串是4小時前,我們可以告訴你,你最有可能在東歐,也許莫斯科。

所以,如果你想看到你的時區的字符串,你需要使用NSDateFormatter從日期對象創建它。

NSLog(@"tmp is %@",[formatter stringFromDate:tmp]); 

檢查,如果是正確的,我說的是,改變格式來包含時間組件。

formatter.format = [@"yyyy-MM-dd HH:mm"]; 
NSLog(@"tmp is %@",[formatter stringFromDate:tmp]); 

的格式也將採取「古怪」像閏日,Leap Month(是 - 那些退出),夏令時間,Leap Seconds ...帳戶 - accordantly當前的日曆。


一個偉大的WWDC 2011視頻:Performing Calendar Calculations - 一個必須看到每個可可開發商。


BTW:打印你不使用的NSLog一個對象需要調用-description它在一個字符串傳遞。 NSLog將在內部執行此操作。

NSLog(@"tmp is %@", tmp); 

就好了。

1

答案很簡單,NSLog只是使用格式化程序將GMT時間(零)時區轉換爲NSDateNSString

您的格式化程序默認設置爲您的默認時區,可能是-4:00。打印出來時,NSLog將其轉換爲0:00,增加4小時。

通常,解析日期而不指定其時區是不安全的。