2011-04-01 118 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

相關問題