由于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字符串?
答案 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"];
}