Как я могу получить представление NSDate plist программно? - PullRequest
1 голос
/ 01 апреля 2011

Поскольку plist - это xml, то есть текст, когда объект NSDate записывается в plist, результат выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
      <date>2011-04-01T02:09:15Z</date>
</plist>

Я хотел бы получить эту строку (011-04-01T02:09:15Z)напрямую, без всего окружения.Должен быть более разумный способ сделать это, чем:

NSString *xmlRepresentationOfCurrentDate = [[[[[[[NSString alloc] initWithData:[NSPropertyListSerialization dataFromPropertyList:self format:kCFPropertyListXMLFormat_v1_0 options:0 error:NULL] encoding:NSUTF8StringEncoding] autorelease] componentsSeparatedByString:@"<date>"] objectAtIndex:1] componentsSeparatedByString:@"</date>"] objectAtIndex:0];

Что усложняет тот факт, что представленное выше представление является GMT, и, очевидно, часовой пояс устанавливается во время создания объекта NSDate.Я вижу альтернативу приведенному выше коду: получить смещение по Гринвичу, использовать его в методе dateWithTimeInterval:sinceDate: для получения даты по Гринвичу, а затем с помощью NSDateFormatter выписать приведенную выше строку.Тем не менее, поскольку это приводит к еще большим накладным расходам.

Есть ли способ получить только эту строку XML?

Ответы [ 3 ]

0 голосов
/ 01 апреля 2011

Если вы действительно создаете списки свойств, которые содержат только одну дату, код, который вы разместили, кажется правильным решением.Я могу видеть, что вы чувствуете, что это немного громоздко, но вы всегда можете вставить это в метод в категории на NSDate, чтобы вы могли читать или записывать даты непосредственно из или в формат списка свойств.

0 голосов
/ 06 апреля 2011

Кажется, что NSDateFormatter на самом деле является лучшим вариантом, учитывая обстоятельства - мне нужно запустить его на устройствах с iOS 3.1.3 и выше, поэтому метод dataWithPropertyList:format:options:error: (представлен в 4.0) не вариант, в то время какdataFromPropertyList:format:errorDescription: предназначено для устаревания.

Кроме того, я допустил ошибку выше: это должно быть

NSString *xmlRepresentationOfCurrentDate = [[[[[[[NSString alloc] initWithData:[NSPropertyListSerialization dataWithPropertyList:self format:kCFPropertyListXMLFormat_v1_0 options:0 error:NULL] encoding:NSUTF8StringEncoding] autorelease] componentsSeparatedByString:@"<date>"] objectAtIndex:1] componentsSeparatedByString:@"</date>"] objectAtIndex:0];

Но реальное решение для всех версий - это метод категории на NSDate:

-(NSString *)xmlRepresentation{
    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setTimeStyle:NSDateFormatterFullStyle];

    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
    [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

    return [[formatter stringFromDate:self] stringByAppendingString:@"Z"];
}
0 голосов
/ 01 апреля 2011

Метод NSDate description возвращает строку в формате ГГГГ-ММ-ДД ЧЧ: ММ: СС ± ЧЧММ.

Редактировать : executor21 указал, что приведенный ниже раздел действителен только для OS X, но не для iOS.

Если вы не хотите использовать этот формат, вы можете использовать descriptionWithCalendarFormat:timeZone:locale: и определить свой собственный формат. Смотри http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html%23//apple_ref/occ/instm/NSDate/description

...