1

我正在使用 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);
4

2 回答 2

2

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

我有一个像你这样的测试,它的输出是这样的: 在此处输入图像描述

因此,您可以使用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);

输出是正确的: 在此处输入图像描述

于 2014-05-05T11:34:16.347 回答
0

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

于 2014-05-05T14:47:39.073 回答