【问题标题】:NSDate detection with NSDataDetector使用 NSDataDetector 进行 NSDate 检测
【发布时间】:2013-12-23 12:10:09
【问题描述】:

我试图从 UNKNOWN 格式的 NSString 中获取 NSDate,所以我写了一个如下所示的函数

-(void)dateFromString:(NSString*)string {

    NSError *error = NULL;
    NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:(NSTextCheckingTypes)NSTextCheckingTypeDate error:&error];

    NSArray *matches = [detector matchesInString:string
                                         options:0
                                           range:NSMakeRange(0, [string length])];

    NSLocale* currentLoc = [NSLocale currentLocale];
    for (NSTextCheckingResult *match in matches) {
        if ([match resultType] == NSTextCheckingTypeDate) {
            NSLog(@"Date : %@", [[match date] descriptionWithLocale:currentLoc]);
        }
    }
}

除了一个地方,它运作良好。

如果我调用

[self dateFromString:@"6/12"];

打印出来

日期:2014 年 6 月 12 日星期四,澳大利亚东部时间下午 12:00:00 标准时间

如果我同时打电话

[self dateFromString:@"13/12"];

打印出来

日期:周五,2013 年 12 月 13 日,澳大利亚东部时间下午 12:00:00 夏令时

基本上,我希望函数行为一致。由于我住在澳大利亚,它应该在 12 月 6 日返回第一次执行。第二次调用结果正确。

我在这里做错了什么?

【问题讨论】:

  • 你为什么不使用NSDateFormatter,它很灵活,你可以很容易地解决你的问题,因为你可以设置日期字符串的格式。您使用 setDateFormat 设置日期格式,然后调用 dateFromString: 将字符串转换为日期
  • 我认为没有处理 UNKNOWN 格式日期字符串的好方法。您应该确定日期字符串的格式
  • 难以置信,我的谷歌搜索如何让我找到我正在寻找的东西,伙计:)

标签: ios objective-c nsdate nsregularexpression nsdatadetector


【解决方案1】:

其实我写的方法效果很好:)。不幸的是,我的测试手机中的区域格式设置为美国并且从未设置回澳大利亚:我的坏..

@joiningss :将一些随机格式化的日期字符串扔给该方法,您会惊讶于苹果如何让开发人员轻松实现。无论如何,非常感谢。

@mrt,Chavda&Greg:非常感谢大家。非常感谢您的帮助。

【讨论】:

  • 也许你可以帮忙。当我使用 NSDataDetector 时,我在结果中得到的 NSDate 似乎是错误的(例如 String '2019-02-14' Translated to 'Thursday, 14 February 2019 at 12:00:00 Israel Standard Time')并且我无法说服检测器确定 00:00:00 - 因为输入字符串中没有明显的时间。
【解决方案2】:

你必须使用 NSDateFormatter。尝试将您的 if 语句替换为:

if ([match resultType] == NSTextCheckingTypeDate) {
   NSDate *dateAfter = [match date];
   NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
   [dateFormatter setDateFormat:@"yyyy-MM-dd 'at' HH:mm"];
   NSString *formattedDateString = [dateFormatter stringFromDate:dateAfter];
   NSLog(@"After: %@", formattedDateString);
}

如果您想以不同的格式显示它,您必须将此行更改为所需的格式:

[dateFormatter setDateFormat:@"yyyy-MM-dd 'at' HH:mm"];

如果您希望它与您的第一个示例匹配,请将其更改为:

[dateFormatter setDateFormat:@"EEEE, MMMM dd, yyyy 'at' HH:mm:ss a zzzz"];

【讨论】:

    猜你喜欢
    • 2014-06-05
    • 2013-12-09
    • 2014-05-08
    • 2012-02-09
    • 1970-01-01
    • 2014-11-29
    • 2014-08-23
    • 2015-08-24
    • 1970-01-01
    相关资源
    最近更新 更多