我注意到了一些使用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:30 got_date:2016-06 -18 15:30:00 +0000 formatted_time:10:30
- 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:30 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:30 got_date:2016-06 -17 15:30:00 +0000 formatted_time:10:30
- 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
我的假设是,我只是不理解的东西与日期处理和日期提取的基础,但它似乎很奇怪,我认为只有检测日期的一个子集转变 - 基于系统时钟的时间。
任何线索为什么发生这种情况将不胜感激。
非常非常有趣。考虑到如何应用数据检测器,这是非常有意义的。你只是在那里扩大了我的知识和欣赏。而且我完全了解了你不做假设和对地区敏感。 (编辑是因为我愚蠢地击中“返回”)。谢谢 - 这确实有帮助! – eww