【问题标题】:NSDate from NSDateFormatterNSDate 来自 NSDateFormatter
【发布时间】:2015-08-25 16:48:34
【问题描述】:

我正在测试一些 dateFormatter,但我遇到了一个简单的问题

formatter :

- (void)testDate {

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd/MM/yyyy"];
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"];
    [dateFormatter setLocale:locale];
    NSString *stringDate = @"23/03/1";
    NSDate *date = [dateFormatter dateFromString:stringDate];
    XCTAssertTrue(date == nil);
}

我的测试是红色的,因为日期不为零。当我打印日期时:

(lldb) po date
0001-03-22 23:50:39 +0000

NSDateFormatter 正在填充日期字符串(1 ----> 0001)。我不想要这个填充。您认为这是 NSDateFormatter 的正确行为吗? (它是 NSDateFormatter 类中的错误吗?)。我怎样才能避免这种情况?

谢谢

【问题讨论】:

  • 我已经阅读了它并且在我的代码中没有看到任何错误,你看到了什么吗?
  • 你的问题是为什么dd/MM/yyyy成功解析23/3/1?还是您的问题是,为什么在成功解析之后,po date 将年份显示为四位数字,填充为零?仅供参考,po date 输出的填充与NSDateFormatter 无关,而是与po 用于输出字符串的description 方法有关。
  • 我的问题是第一个:为什么它解析正确?

标签: ios nsdate nsdateformatter


【解决方案1】:

我认为为什么@"23/03/1" 被认为是格式化程序为@"dd/MM/yyyy" 的有效日期没有一个很好的答案。这就是它的工作原理。但是如果你想测试它是否是##/##/#### 格式,你可以这样做:

NSRange range = [stringDate rangeOfString:@"^\\d{2}/\\d{2}/\\d{4}$" options:NSRegularExpressionSearch];
XCTAssert(range.location == NSNotFound, @"Not in ##/##/#### format");

显然,您必须将其与 NSDateFormatter 测试结合起来,以确保这些值也是合理的,但以上将测试位数。

【讨论】:

  • 感谢您的回答。我想我会把它作为错误报告提交,看看苹果工程师是怎么想的。
  • @samir - 他们说的话会很有趣,但如果他们流畅地回答“按设计工作”我不会感到惊讶,因为更改/修复它会破坏向后兼容性,这是任何神圣不可侵犯的功能API。我不认为很多人依赖yyyy 的行为,但我敢打赌,有大量代码确实依赖于MMdd 匹配个位数,而您描述的这种行为只是yyyy相等的。也许我们最终会看到一个新的formatterBehavior 设置。
【解决方案2】:

日期格式化程序仅用于将字符串日期解析为NSDate

lldb po 命令只是根据一些 Apple 开发人员认为好的格式设置日期,并且它仅用于调试。在内部,NSDate 使用我们认为自格林威治标准时间 2001 年 1 月 1 日第一时刻以来的秒数。

你想要的是使用日期格式化程序将日期格式化成你想要的字符串格式。

使用问题代码中格式字符串的示例代码:

NSString *dateString = [dateFormatter stringFromDate:date];
NSLog(@"dateString: %@", dateString);

输出:

日期字符串:23/03/1999

添加输出日期格式以满足您的需求。

【讨论】:

  • 感谢您的回答。我的问题是为什么 @"23/03/1" 是使用 NSDateFormatter 转换时的有效日期? (我的格式化程序中有说明符,年份应该是 4 位数字)
【解决方案3】:

我的猜测是,由于“dd/MM/yyyy”只是一种格式,当NSDateFormatter 处理它时,将给定的日期解析为 3 个数字并转换为日期。所以“1”只是转移到“0001”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多