我正在比较上次修改文件的两个文件的日期,一个是本地文件,另一个是亚马逊S3服务器上的文件。我正在使用AWS IOS SDK框架,可以成功请求和接收来自S3服务器的响应,但我无法理解返回的s3日期的格式。
在我的本地机器上,lastModified的日期格式为“2011-07-21 18:43:15 -0400”,而驻留在S3服务器上的文件为“2011-10-15T16:25:49.000Z”
我的本地信息使用:
获得 NSFileManager *fm = [NSFileManager defaultManager];
NSDictionary *attr = [fm attributesOfItemAtPath:filePath error:nil];
NSDate *localDate = [attr objectForKey:NSFileModificationDate];
虽然我的S3信息是使用
获得的 for (S3ObjectSummary *object in [listObjectsResult objectSummaries]) {
NSDate *s3date = [object lastModified];
}
是否有人知道我是否可以将S3文件的日期转换为可用于比较这两个日期的格式:
NSTimeInterval deltaSeconds = [s3Date timeIntervalSinceDate: localDate];
或者我在这里做错了什么?现在我的程序崩溃了
[NSCFString timeIntervalSinceReferenceDate]: unrecognized selector sent to instance 0x200351360.
可能是因为s3日期格式格式不正确。我很擅长使用AWS S3 SDK,因此非常感谢所有帮助。如果有人也知道这个框架的一些好的教程(除了它附带的演示代码),那将是伟大的。干杯,特隆德
答案 0 :(得分:4)
我认为[object lastModified]
只会返回NSString
而不是NSDate
对象,如documentation中所述。
NSDateFormatter
从字符串创建NSDate
对象:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'+'mm':'ss.SSS'Z'"];
NSDate *s3date = [dateFormatter dateFromString:[object lastModified]];
[dateFormatter release];
Date Formatting guide有很多方便的例子。您可能需要稍微调整格式字符串,因为我还没有测试过。
答案 1 :(得分:2)
对于给定的答案有些麻烦 - 似乎存在某种重复的“s”+“mm”内容阻止字符串正确翻译。此外,由于字符串中的时区以UTC格式给出,因此您必须设置格式化程序的时区。这是我使用的代码(对我有用),我把它变成了一个类别,并默认使用以前提供的字符串,如果对我有用的代码不适合你:
@interface S3ObjectSummary (lastModifiedDate)
- (NSDate *)lastModifiedDate;
@end
@implementation S3ObjectSummary (lastModifiedDate)
- (NSDate *)lastModifiedDate
{
NSString *modifiedString = [self lastModified];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; // Note, this is ARC, add autorelease if you aren't ARC
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS'Z'"];
NSDate *modifiedDate = [dateFormatter dateFromString:modifiedString];
if(!modifiedDate) // Try other format in case of fail http://stackoverflow.com/a/7799607/285694
{
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'+'mm':'ss.SSS'Z'"];
modifiedDate = [dateFormatter dateFromString:modifiedString];
}
return modifiedDate;
}
@end
答案 2 :(得分:0)
看起来这也有效:
NSDate *summaryDate = [NSDate dateWithISO8061Format:summary.lastModified];