2014-05-05 27 views
1

我正在使用NSDataDetector讀取並將NSString日期/時間交換到NSDate中。iOS的NSDataDetector交換AM小時至PM小時(兩者應該是24小時)

輸入(lastRefreshStampString)是2014-05-05 02:54:45 +0000但是,一旦它被NSDataDetector處理,result.date就會變成2014-05-05 14:54:45 +0000。出於某種原因,它將02看作是PM並將其交換。

我該如何糾正這種行爲?

NSLog(@"lastRef:%@",lastRefreshStampString); 

      __block NSDate *lastRefreshStamp; 

      //Detect data format 
      NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingAllTypes error:nil]; 
      [detector enumerateMatchesInString:lastRefreshStampString 
             options:kNilOptions 
             range:NSMakeRange(0, [lastRefreshStampString length]) 
            usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
      { lastRefreshStamp = result.date; }]; 

      NSLog(@"lastRef:%@",lastRefreshStamp); 

回答

2

因爲時區不同。 NSDataDetector使用GTM,但你的系統時區不是(我猜...)。

我有你這樣的測試,它的輸出是這樣的: enter image description here

所以,你可以使用NSDateFormatterNSDateFormatter的默認時區相同的系統時區,這樣你就可以得到正確的日期。

NSString *lastRefreshStampString = @"2014-05-05 02:54:45 +0000"; 

NSLog(@"lastRefString:%@",lastRefreshStampString); 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; 

NSLog(@"time zone : %@",dateFormatter.timeZone.name); 
NSLog(@"system time zone : %@",[NSTimeZone systemTimeZone].name); 

NSDate *lastRefreshStamp = [dateFormatter dateFromString:lastRefreshStampString]; 

NSLog(@"lastRef:%@",lastRefreshStamp); 

輸出是正確的: enter image description here

+0

謝謝你。發現!我從來沒有意識到NSDataDetector有這樣的問題!再次感謝。 – MrNeilM

0

不要使用NSDataDetector解析固定格式的日期。 NSDataDetector有大量的啓發式方法,可以使日期檢測在普通用戶的文本內容中更好地工作。它不適合解析非自然語言的日期。使用NSDateFormatter。

相關問題