来自 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
测试结合起来以确保值也合理,但以上将测试位数。
我正在测试一些 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
测试结合起来以确保值也合理,但以上将测试位数。