2011-04-01 120 views
1

由于的plist是XML,这是文本,当一个NSDate对象被写入的plist,结果是这样的:直接如何以编程方式获得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

这似乎是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

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

+0

'descriptionWithCalendarFormat:时区:区域: '是一种Mac OS X方法,它在iOS上不存在。 – executor21 2011-04-01 02:47:30

+0

对不起,我认为苹果公司会有这两种。我会编辑我的帖子以表明这一点。 – ughoavgfhw 2011-04-01 02:54:36

+1

它也“被弃用”,所以你不应该在任何平台上使用它。 – 2011-04-01 04:34:56

0

如果您确实在创建仅包含单一日期的属性列表,则您发布的代码看起来似乎是正确的选择。我可以看到你可能觉得这有点麻烦,但你总是可以将它粘贴到NSDate类别的方法中,以便直接从属性列表格式读取或写入日期。

+0

你其实是对的,但主要问题是'dataFromPropertyList:format:errorDescription:'是一种预计弃用和替换的方法,'dataWithPropertyList:format:options:error:'仅在iOS 4.0和更高版本中可用。我需要我的代码在3.1.3及以上系统上运行。在这种情况下,NSDateFormatter是最好的选择(请参阅下面的答案)。 – executor21 2011-04-05 23:55:25

+0

那么为什么不测试存在'-dataWithPropertyList:format:options:error:',并回退到'-dataFromPropertyList:format:errorDescription:'如果它不可用? – Caleb 2011-04-06 00:59:47

相关问题