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, 07:01 или 08:01 (все те же результаты), они выглядят "правильными", так как кажется, что время выводится последовательно.


  • оригинал:07:30 дата: 2016-06-18 12:30:00 +0000 formatted_time: 07: 30
  • оригинал:8:30 дата: 2016-06-18 13:30:00 +0000 formatted_time: 08: 30
  • Оригинал:9:30: дата: 2016-06-18 14:30:00 +0000 formatted_time: 09: 30
  • Оригинал: 10:30: дата: 2016-06-18 15:30:00 +0000 formatted_time: 10: 30
  • Оригинал: 11:30: дата: 2016-06-18 16:30:00 +0000 formatted_time: 11: 30

Время системных часов: 9:01 утра по центральному району США. Дата 8:30 смещена (но не 7:30, 9:30, 10:30 или 11:30).


  • оригинал: 07: 30 дата:2016-06-17 12:30:00 +0000 formatted_time:07:30
  • оригинал:8:30 дата:2016-06-18 01:30:00 +0000 formatted_time:20:30
  • Оригинал:9:30: дата:2016-06-17 14:30:00 +0000 formatted_time:09:30
  • оригинал: 10:30 дата:2016-06-17 15:30:00 +0000 formatted_time:10:30
  • оригинал: 11:30 дата:2016-06-17 16:30:00 +0000 formatted_time:11:30

Время системных часов: 10:01 утра по центральному району США (и теперь 8:30 и 9:30 смещены, но не остальные)


  • оригинал: 07: 30 дата:2016-06-17 12:30:00 +0000 formatted_time:07:30
  • оригинал:8:30 дата:2016-06-18 01:30:00 +0000 formatted_time:20:30
  • оригинал:9:30 дата:2016-06-18 02:30:00 +0000 formatted_time:21:30
  • оригинал: 10:30 дата:2016-06-17 15:30:00 +0000 formatted_time:10:30
  • оригинал: 11:30 дата:2016-06-17 16:30:00 +0000 formatted_time:11:30

Системное время: 11:01 утра по центральному центру США (и так далее...)


  • оригинал: 07: 30 дата:2016-06-17 12:30:00 +0000 formatted_time:07:30
  • оригинал:8:30 дата:2016-06-18 01:30:00 +0000 formatted_time:20:30
  • оригинал:9:30 дата:2016-06-18 02:30:00 +0000 formatted_time:21:30
  • оригинал: 10:30 дата:2016-06-18 03:30:00 +0000 formatted_time:22:30
  • оригинал: 11:30 дата:2016-06-17 16:30:00 +0000 formatted_time:11:30

Мое предположение состоит в том, что я просто не понимаю чего-то фундаментального в обработке дат и их извлечении, но мне кажется странным, что смещается только подмножество обнаруженных дат - в зависимости от времени системных часов.

Любая подсказка о том, почему это происходит, будет наиболее ценной.

1 ответ

Решение

Это эвристика... Детекторы данных пытаются угадать, какая дата наиболее вероятна. Если вы сканируете "8:30" в 9:01, то детекторы данных предполагают, что имеет больше смысла, если речь идет о 8:30 вечера (в будущем), а не о 8:30 утра (в прошлом). Вот почему вы получаете отформатированное время 20:30 (20:30).

Если вы посмотрите на свои различные тесты, то увидите, что даты, предполагаемые в качестве PM, всегда являются теми, которые были в прошлом относительно текущей даты, если бы они были обнаружены как AM.

Вы не должны предполагать, что это то, что всегда будет происходить. Это поведение зависит от региона.

Другие вопросы по тегам