在我的更新被拒绝后,我刚收到Apple的崩溃日志。
在查看崩溃日志后,我发现了违规代码,这与解析日期有关。
当我在我的设备上运行此应用程序时,我没有收到此错误。我感觉这是Apple正在测试的设备本地问题。
在我的投放期间,下面的original
字符串已解析为2012-12-04T11:02:29.5600000+0000
。我只是想知道如果在不同的Locale中它会出现的其他方式。
更重要的是,如何在与Apple相同的环境中测试我的应用,这样我就不需要等待审核流程进行测试
注意:我继承了这段代码,因此非常感谢有关改进日期解析功能的任何建议,谢谢。
崩溃来自以下函数中的[original substringToIndex:range.location+3]
调用。
+(NSString*)convertDate:(NSDate*)date withFormatter:(NSDateFormatter*)dateFormatter{
NSString *original = [dateFormatter stringFromDate:date];
NSRange range = [original rangeOfString:@"+"];
NSString *substring = [original substringToIndex:range.location+3];
NSString *substring2 = [original substringFromIndex:range.location+3];
return [NSString stringWithFormat:@"%@%@%@",substring,@":",substring2];
}
此功能的调用在以下上下文中进行
NSDate *timestamp = [NSDate date];
NSString *dateString = [DateHelper convertDate:timestamp withFormatter:UTCDateFormatter];
答案 0 :(得分:1)
完全有可能说+3导致出现超出范围的异常。你测试过使用[NSDate date]会在其他时区返回相同的格式吗?
无论哪种方式,你应该至少检查两件事 - 然后解析方法多个日期类型以确认应用程序仍然可以运行:
以下行的范围包含位置:
NSRange range = [original rangeOfString:@"+"];
if (range.location != NSNotFound)
{
//do stuff here
}
您放入的range.location + 3不超过总字符串长度
NSRange range = [original rangeOfString:@"+"];
if (range.location != NSNotFound)
{
if ((range.location + 3) <= original.length)
{
//you should also check that ((range.location + 3) + range.length) <= original.length as well
//do stuff here
}
}
虽然上述内容并未真正解决可能显示错误日期/时间戳的问题 - 但它应该阻止应用程序尝试搜索字符串长度范围之外的范围或索引
希望这有帮助,
答案 1 :(得分:0)
NSDateFormatter将使用您的设备日期格式和时区格式化您的日期。
// Convert the date to current time zone
NSDate* sourceDate = [NSDate date];
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = sourceGMTOffset - destinationGMTOffset;
NSDate *destinationDateHere1 = [[NSDate alloc] initWithTimeInterval:interval sinceDate:yourDate];