NSDataDetector - 仅解析时间时转换时区(无 mm/dd/yyyy)
NSDataDetector - shifting timezone when parsing only time (no mm/dd/yyyy)
我在使用 NSDataDetector 从文本中提取时间时注意到了一些问题,但我不确定我是否理解发生了什么。在我的情况下,我唯一的信息是时间——没有额外的 day/month/year 日期信息。只是日期的时间部分 - 例如可能嵌入文本字符串中的“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 日期,但我不明白的是为什么 date/time 会改变结果。日期似乎是根据系统时钟时间移动的,但不是全部。
如果我将系统时钟时间设置为:06:01AM、07:01AM 或 08: 01AM(所有相同的结果)这些看起来 "right" 因为时间似乎是一致推断的。
- 原: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:30 got_date:2016-06-18 15:30:00 +0000 formatted_time:10:30
- 原文:11:30 got_date:2016-06-18 16:30:00 +0000 formatted_time:11:30
系统时钟时间:09:01AM 美国中部 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:30 got_date:2016-06-17 15:30:00 +0000 formatted_time:10:30
- 原文: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:30 got_date:2016-06-17 15:30:00 +0000 formatted_time:10:30
- 原文: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:30 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
我的假设是我只是不了解日期处理和日期提取的一些基本知识,但我觉得只有检测到的日期的一个子集会根据系统时钟时间发生变化,这对我来说真的很奇怪。
任何关于为什么会发生这种情况的线索将不胜感激。
这些是试探法...数据检测器试图猜测最可能的日期是什么。如果您在 9:01 处扫描“8:30”,那么数据检测器会假设它指的是 8:30 下午(将来)而不是 8:30 上午(在过去)。这就是为什么你得到的格式化时间是 20:30 (8:30 PM).
如果您查看各种测试,您会发现假定为下午的日期始终是相对于当前日期的过去日期(如果它们被检测为上午)。
你也不应该假设这是总是会发生的事情。此行为特定于语言环境。
我在使用 NSDataDetector 从文本中提取时间时注意到了一些问题,但我不确定我是否理解发生了什么。在我的情况下,我唯一的信息是时间——没有额外的 day/month/year 日期信息。只是日期的时间部分 - 例如可能嵌入文本字符串中的“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 日期,但我不明白的是为什么 date/time 会改变结果。日期似乎是根据系统时钟时间移动的,但不是全部。
如果我将系统时钟时间设置为:06:01AM、07:01AM 或 08: 01AM(所有相同的结果)这些看起来 "right" 因为时间似乎是一致推断的。
- 原: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:30 got_date:2016-06-18 15:30:00 +0000 formatted_time:10:30
- 原文:11:30 got_date:2016-06-18 16:30:00 +0000 formatted_time:11:30
系统时钟时间:09:01AM 美国中部 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:30 got_date:2016-06-17 15:30:00 +0000 formatted_time:10:30
- 原文: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:30 got_date:2016-06-17 15:30:00 +0000 formatted_time:10:30
- 原文: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:30 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
我的假设是我只是不了解日期处理和日期提取的一些基本知识,但我觉得只有检测到的日期的一个子集会根据系统时钟时间发生变化,这对我来说真的很奇怪。
任何关于为什么会发生这种情况的线索将不胜感激。
这些是试探法...数据检测器试图猜测最可能的日期是什么。如果您在 9:01 处扫描“8:30”,那么数据检测器会假设它指的是 8:30 下午(将来)而不是 8:30 上午(在过去)。这就是为什么你得到的格式化时间是 20:30 (8:30 PM).
如果您查看各种测试,您会发现假定为下午的日期始终是相对于当前日期的过去日期(如果它们被检测为上午)。
你也不应该假设这是总是会发生的事情。此行为特定于语言环境。