Objective c NSLog打印带有错误的NSString
我一直在玩弄日期格式,并提出了一个简单的测试,看看它是否按预期工作。它创建了一系列日期,从当前开始,每次迭代15分钟后返回。然后测试输出格式化日期和实际日期数据进行比较:Objective c NSLog打印带有错误的NSString,objective-c,nsstring,nslog,Objective C,Nsstring,Nslog,我一直在玩弄日期格式,并提出了一个简单的测试,看看它是否按预期工作。它创建了一系列日期,从当前开始,每次迭代15分钟后返回。然后测试输出格式化日期和实际日期数据进行比较: - (void)testDateFormatting { NSDate *date; NSDateFormatter *formatter = [NSDateFormatter new]; [formatter setLocale:[NSLocale localeWithLocaleIdentifi
- (void)testDateFormatting {
NSDate *date;
NSDateFormatter *formatter = [NSDateFormatter new];
[formatter setLocale:[NSLocale localeWithLocaleIdentifier:@"ru_RU" ]];
[formatter setDateFormat:@"HH:mm EE dd.MM"];
for (NSUInteger i = 0; i < 500; i++) {
NSTimeInterval time = - (60.0 * i * 15);
date = [NSDate dateWithTimeIntervalSinceNow:time];
NSString *formattedDateString = [SCRBDateFormatter stringFormattedToXAgoFromDate:date];
NSLog(@"%@ - %@", formattedDateString, [formatter stringFromDate:date]);
XCTAssert(formattedDateString, @"TEST_ERROR: stringFormattedToXAgoFromDate: returned nil.");
}
}
当然,输出应该是相同的。我不确定是什么原因造成的。好像打印的字符串在印刷过程中被改变了。我认为所有这些方法都是同步的。知道去哪里找吗
实际的应用程序似乎并没有这个问题,它们只在测试中出现
这是格式化代码。我知道现在它的优化非常糟糕,有很多返回语句,这不是重点
+ (NSString *)stringFormattedToXAgoFromDate:(NSDate *)date {
NSString *result = nil;
static NSCalendar *calendar = nil;
if (!calendar) {
calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
}
NSTimeInterval timeGap = [[NSDate date] timeIntervalSince1970] - [date timeIntervalSince1970];
if (timeGap < 0) {
NSLog(@"SCRB_ERROR: scrb_formatDateToXTimeAgoString: cannot format date. Date argument is later than current date.");
return nil;
}
NSDateComponents *components = [calendar components:NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitSecond | NSCalendarUnitYear fromDate:date toDate:[NSDate date] options:0];
static NSDateFormatter *formatter = nil;
if (!formatter) {
formatter = [NSDateFormatter new];
NSLocale *_ruLocale = [NSLocale localeWithLocaleIdentifier:kRuLocaleIdentifier];
[formatter setLocale:_ruLocale];
}
if (timeGap < 60) {
result = @"ТОЛЬКО ЧТО";
return result;
}
if (timeGap < 60*60) {
result = [NSString stringWithFormat:@"%td МИН. НАЗАД", components.minute];
return result;
}
if (timeGap < 60*60 * 5) {
result = [NSString stringWithFormat:@"%td Ч. НАЗАД", components.hour];
return result;
}
if (timeGap < 60*60 * 24 * 2) {
if ([calendar isDateInToday:date]) {
[formatter setDateFormat:@"HH:mm"];
result = [formatter stringFromDate:date];
return result;
} else if ([calendar isDateInYesterday:date]) {
return @"ВЧЕРА";
}
}
if (timeGap < 60*60*24 * 7) {
[formatter setDateFormat:@"EEEE"];
result = [[formatter stringFromDate:date] uppercaseString];
return result;
}
if (components.year < 1) {
[formatter setDateFormat:@"dd MMM"];
result = [[formatter stringFromDate:date] uppercaseString];
return result;
}
if (components.year >= 0) {
[formatter setDateFormat:@"dd.MM.YYYY"];
result = [formatter stringFromDate:date];
return result;
}
return result;
}
这个在循环中
[array addObject:formattedDateString];
以及测试结束时的断点。数组中的字符串没有日志中显示的任何错误 显示
scrb\u formatDateToXTimeAgoString
@trojanfoe的实现如果我在发帖时搞砸了一点,你提到的方法是stringFormattedToXAgoFromDate:
,对我来说,最大的谜团是为什么每个日志语句开头的时间戳顺序不正确。您发布的所有代码都是同步的。你有可能在两个不同的线程上进行两个测试吗?@rmaddy是的,我也觉得很奇怪。我实际上是在运行一个测试(通过直接按它)。我发现了一些新信息,请参见更新2。显示scrb\u formatDateToXTimeAgoString
@特洛伊木马的实现。我在发表文章时有点搞砸了,你提到的方法是stringFormattedToXAgoFromDate:
,最大的谜团是为什么每个log语句开头的时间戳都是无序的。您发布的所有代码都是同步的。你有可能在两个不同的线程上进行两个测试吗?@rmaddy是的,我也觉得很奇怪。我实际上是在运行一个测试(通过直接按它)。我发现了一些新信息,请参见更新2。
NSMutableArray *array = [NSMutableArray new];
[array addObject:formattedDateString];