NSDataDetector - 仅解析时间时移动时区(无mm / dd / yyyy)

时间:2016-06-18 13:13:14

标签: objective-c cocoa nsdatadetector

当我使用NSDataDetector从文本中抽出时间时,我发现了一些东西,我不确定我是否理解正在发生的事情。在我的情况下,我唯一的信息是时间 - 没有额外的日/月/年日期信息。只是日期的时间部分 - 比如“11:30”,可能嵌入在一串文本中。

从字符串中提取日期信息的示例函数:

-(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 AM 07:01 AM ,或 08:01 AM (所有相同的结果)这些看起来“正确”,因为时间似乎是一致推断的。

  • 原文:07:30 got_date:2016-06-18 12:30:00 +0000 formatted_time:07:30
  • 原文:8:30 got_date:2016-06-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
  • 原文:11:30 got_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-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-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:3​​0
  • 原文:11:30 got_date:2016-06-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-06-18 02:30:00 +0000 formatted_time: 21:30
  • 原文:10:3​​0 got_date:2016-06-17 15:30:00 +0000 formatted_time:10:3​​0
  • 原文:11:30 got_date:2016-06-17 16:30:00 +0000 formatted_time:11:30

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

  • 原文: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-06-18 02:30:00 +0000 formatted_time: 21:30
  • 原文:10:3​​0 got_date: 2016-06-18 03:30:00 +0000 formatted_time: 22:30
  • 原文:11:30 got_date:2016-06-17 16:30:00 +0000 formatted_time:11:30

我的假设是我只是不理解日期处理和日期提取的基本内容,但对我来说,根据系统时钟时间,只检测到日期的一部分会发生变化,这似乎很奇怪。

对于为什么会发生这种情况的任何线索都将非常感激。

1 个答案:

答案 0 :(得分:1)

这些是启发式算法......数据检测器试图猜测最可能的日期是什么。如果您扫描&#34; 8:30&#34;在9:01然后数据检测器假设它更有意义,如果它指的是晚上8:30(将来),而不是8:30 AM(过去)。这就是为什么你得到的格式化时间是20:30(晚上8:30)。

如果您查看各种测试,您会发现假定为PM的日期始终是过去相对于当前日期的日期,如果它们被检测为AM。

你不应该认为这也是一直发生的事情。此行为是特定于语言环境的。