gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:48:34 24 4
gpt4 key购买 nike

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

<小时/>
  • 原始: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 获取日期:2016-06-18 01:30:00 +0000 格式化时间: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:01AM 美国中部(现在 8:30 和 9:30 发生了偏移,但其他时间不变)

<小时/>
  • 原始:07:30 got_date:2016-06-17 12:30:00 +0000 formatted_time:07:30
  • 原始:8:30 获取日期:2016-06-18 01:30:00 +0000 格式化时间:20:30
  • 原始:9:30 获取日期:2016-06-18 02:30:00 +0000 格式化时间: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:01AM 美国中部(依此类推...)

<小时/>
  • 原始:07:30 got_date:2016-06-17 12:30:00 +0000 formatted_time:07:30
  • 原始:8:30 获取日期:2016-06-18 01:30:00 +0000 格式化时间:20:30
  • 原始:9:30 获取日期:2016-06-18 02:30:00 +0000 格式化时间:21:30
  • 原始:10:30 获取日期:2016-06-18 03:30:00 +0000 格式化时间:22:30
  • 原始:11:30 got_date:2016-06-17 16:30:00 +0000 formatted_time:11:30

我的假设是我只是不了解日期处理和日期提取的基本知识,但对我来说,只有检测到的日期的子集基于系统时钟时间发生变化,这似乎很奇怪。

任何关于为什么会发生这种情况的线索将不胜感激。

最佳答案

这些都是启发式的......数据检测器尝试猜测最可能的日期是什么。如果您在 9:01 扫描“8:30”,那么数据检测器会认为它指的是晚上 8:30( future )而不是上午 8:30(过去)更有意义。这就是为什么您获得的格式化时间为 20:30(晚上 8:30)。

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

您也不应该假设这总是会发生。此行为是特定于区域设置的。

关于objective-c - NSDataDetector - 仅解析时间时移动时区(无 mm/dd/yyyy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37897358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com