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.
Вы не должны предполагать, что это то, что всегда будет происходить. Это поведение зависит от региона.