iOS NSDataDetector将AM小时交换到PM小时(两者都应该是24小时)

时间:2014-05-05 10:06:21

标签: ios nsdate nsdateformatter nsdatadetector

我正在使用NSDataDetector读取NSString日期/时间并将其交换为NSDate。

输入(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 个答案:

答案 0 :(得分:2)

因为时区不同。 NSDataDetector使用GTM,但您的系统时区不是(我猜......)。

我有像你一样的测试,输出如下: enter image description here

因此,您可以使用NSDateFormatter NSDateFormatter的默认时区与系统时区相同,这样您就可以获得正确的日期。

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

答案 1 :(得分:0)

不要使用NSDataDetector来解析固定格式的日期。 NSDataDetector具有大量的启发式功能,可以在普通用户的文本内容中更好地进行日期检测。它不适合解析非自然语言的日期。使用NSDateFormatter。