Формат даты при получении lastModified - PullRequest
2 голосов
/ 18 октября 2011

Я сравниваю дату последнего изменения файла для двух файлов: одного локального и одного на сервере Amazon 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 ]

4 голосов
/ 18 октября 2011

Мне кажется, что [object lastModified] просто возвращает NSString, а не NSDate объект, как указано в документации .

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

В руководстве по форматированию даты имеется множество удобных примеров.Возможно, вам придется немного подправить строку формата, так как я ее не проверял.

2 голосов
/ 21 января 2013

Возникли проблемы с данным ответом - кажется, что там есть что-то вроде дублирования 'ss' + '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
0 голосов
/ 03 июля 2014

Похоже, это тоже работает:

NSDate *summaryDate = [NSDate dateWithISO8061Format:summary.lastModified];
...