如何以编程方式获取NSDate plist表示?

时间:2011-04-01 02:29:31

标签: iphone objective-c cocoa plist nsdate

由于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对象期间设置了时区。我看到的上述代码的替代方法是获取GMT偏移量,在dateWithTimeInterval:sinceDate:方法中使用它来获取GMT日期,然后使用NSDateFormatter写出上面的字符串。但是,由于这有更多的开销。

有没有办法获得那个xml字符串?

3 个答案:

答案 0 :(得分:0)

NSDate的description方法使用格式YYYY-MM-DD HH:MM:SS±HHMM返回字符串。

编辑: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

答案 1 :(得分:0)

如果你真的在创建只包含一个日期的属性列表,那么你发布的代码似乎是正确的方法。我可以看到你觉得这有点麻烦,但你总是可以将它粘贴到NSDate类别中的方法中,这样你就可以直接从属性列表格式读取或写入日期。

答案 2 :(得分:0)

看起来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"];
}