【问题标题】:iOS NSDataDetector swapping AM hours to PM hours (Both should be 24 hours)iOS NSDataDetector 将上午时间交换为下午时间(两者都应该是 24 小时)
【发布时间】:2014-06-21 14:24:08
【问题描述】:

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

【问题讨论】:

    标签: ios nsdate nsdateformatter nsdatadetector


    【解决方案1】:

    因为时区不同。 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);
    

    输出是正确的:

    【讨论】:

    • 谢谢。发现!我从来没有意识到 NSDataDetector 有这样的问题!再次感谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多