检索lastModified时的日期格式

时间:2011-10-17 20:51:34

标签: objective-c amazon-s3 amazon-web-services

我正在比较上次修改文件的两个文件的日期,一个是本地文件,另一个是亚马逊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,因此非常感谢所有帮助。如果有人也知道这个框架的一些好的教程(除了它附带的演示代码),那将是伟大的。干杯,特隆德

3 个答案:

答案 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];