来自 NSDateFormatter 的 NSDate

NSDate from NSDateFormatter

我正在测试一些 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 class 中的错误吗?)。我怎样才能避免这种情况?

谢谢

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

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

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

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

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

输出:

dateString: 23/03/1999

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

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

我认为对于为什么 @"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 测试结合起来以确保值也合理,但以上将测试位数。