2016-06-18 20 views
0

我注意到了一些使用NSDataDetector将文本拉出的时间,我不确定我是否理解正在发生的事情。在我的情况下,我唯一的信息是时间 - 没有额外的日/月/年的日期信息。只是日期的时间部分 - 比如“11:30”,可能会嵌入一串文本中。NSDataDetector - 仅解析时间时移动时区(不是mm/dd/yyyy)

样本函数从字符串中提取日期信息:

-(NSString*)extractTime:(NSString*)value { 

    NSError *error = NULL; 
    NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:(NSTextCheckingTypes)NSTextCheckingTypeDate error:&error]; 

    NSArray *matches = [detector matchesInString:value options:0 range:NSMakeRange(0, [value length])]; 
    NSDate *dateValue; 

    for (NSTextCheckingResult *match in matches) { 
    if ([match resultType] == NSTextCheckingTypeDate) { 
     dateValue = [match date]; 
    } 
    } 

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"HH:mm"]; 
    NSString *time = [formatter stringFromDate:dateValue]; 

    NSLog(@"original:%@ got_date:%@ formatted_time:%@", value, dateValue, time); 

    return time; 

} 

然后我有一个简单的测试功能在检测到抛出一些时间字符串。

-(void)testTimeExtraction { 

    NSArray<NSString*>* times = @[@"07:30", @"8:30", @"9:30", @"10:30", @"11:30"]; 

    for(NSString *time in times) { 
    NSLog(@"%@", [self extractTime:time]); 
    } 

} 

我期望什么是7:30,8:30,9:30,等等。或者时间信息,如果做不到这一点,至少在某种程度上是一致倍(在相同的时区)。

但是 - 我得到的结果因系统时钟而异。我不明白为什么或如何处理它。我的猜测是,在没有检测到日期的日期部分时,日期被设置为当前的UTC日期,但我不明白的是日期/时间为什么会改变结果。日期似乎根据系统时钟时间而改变,但不是全部。

如果我把我的系统时钟时间:上午06时01上午07时01,或上午08时01(所有相同的结果),这些看起来“正确”的时代似乎一致推断。


  • 原:07:30 got_date:2016年6月18日12:30:00 0000 FORMATTED_TIME:07:30
  • 原:8:30 got_date:2016年6月18日13: 30:00 +0000 formatted_time:08:30
  • 原创:9:30 got_date:2016-06-18 14:30:00 +0000 formatted_time:09:30
  • 原创:10:3​​0 got_date:2016-06 -18 15:30:00 +0000 formatted_time:10:3​​0
  • original:11:30 get_date:2016-06-18 16:30:00 +0000 formatted_time:11:30

系统时钟时间:上午09点01美国中央 8:30日期被移位(但不是7:30,9:30,10:30,11:30或)


  • 原:07:30 got_date:2016年6月17日12:30:00 0000 FORMATTED_TIME:07:30
  • 原:8:30 got_date:2016年6月18日01:30:00 0000 formatted_time:20:30
  • 原创:9:30 got_date:2016-06-17 14:30:00 +0000 formatted_time:09:30
  • 原创:10:3​​0 got_date:2016-06-17 15:30:00 +0000 formatted_time:10 :30
  • 原:11:30 got_date:2016年6月17日16:30:00 +0000 FORMATTED_TIME:11:30

系统时钟时间:10:01美国中央(现在8 :30,和9:30被移位,而不是其他人)


  • 原创:07:30 got_date:2016-06-17 12:30:00 +0000 formatted_time:07:30
  • 原创:8:30 got_date:2016-06-18 01:30:00 +0000 formatted_time :20:30
  • 原:9:30 got_date:2016年6月18日2时30分零零秒0000 FORMATTED_TIME:21:30
  • 原:10:3​​0 got_date:2016-06 -17 15:30:00 +0000 formatted_time:10:3​​0
  • original:11:30 got_date:2016-06-17 16:30:00 +0000 formatted_time:11:30

系统时钟时间:上午11:01美国中部(依此类推...)


  • 原:07:30 got_date:2016年6月17日12:30:00 0000 FORMATTED_TIME:07:30
  • 原:8:30 got_date:2016年6月18日01:30:00 0000 FORMATTED_TIME:20:30
  • 原:9:30 got_date:2016年6月18日2点30分零零秒0000 FORMATTED_TIME:21:30
  • 原:10 :30 got_date:2016年6月18日3点三十分00秒0000 FORMATTED_TIME:22:30
  • 原:11:30 got_date:2016年6月17日16时30分零零秒0000 FORMATTED_TIME:11 :30

我的假设是,我只是不理解的东西与日期处理和日期提取的基础,但它似乎很奇怪,我认为只有检测日期的一个子集转变 - 基于系统时钟的时间。

任何线索为什么发生这种情况将不胜感激。

回答

1

这些都是启发式...数据检测器试图猜测最可能的日期是什么。如果您在9:01扫描“8:30”,则数据检测器假定它指的是下午8:30(未来)而不是上午8:30(过去)更有意义。这就是为什么你的格式化时间是20:30(8:30 PM)。

如果你看看你的各种测试,你会看到假设为PM的日期总是那些过去相对于当前日期的日期,如果它们被检测为AM。

你不应该认为这总是会发生。此行为是特定于语言环境的。

+0

非常非常有趣。考虑到如何应用数据检测器,这是非常有意义的。你只是在那里扩大了我的知识和欣赏。而且我完全了解了你不做假设和对地区敏感。 (编辑是因为我愚蠢地击中“返回”)。谢谢 - 这确实有帮助! – eww