2012-08-04 95 views
0

我有以下字符串作爲輸入:VCAL日期解析問題

BEGIN:VCALENDAR 
VERSION:2.0 
BEGIN:VEVENT 
SUMMARY;CHARSET=utf-8:hello 
LOCATION;CHARSET=utf-8:loc 
DTSTART:20120704T053000Z 
DTEND:20120704T073000Z 
END:VEVENT 
END:VCALENDAR 

我現在面臨的問題是我使用的日期部分:

NSRange end = [Result rangeOfString:@"T"]; 

      NSString *DT=[NSString stringWithFormat:@"%@%@",[Result substringToIndex:end.location],[Result substringFromIndex:end.location+1]]; 

      NSDateFormatter *formatter=[[NSDateFormatter alloc] init]; 
      [formatter setTimeZone:[NSTimeZone defaultTimeZone]]; 
      [formatter setDateFormat:@"yyyyMMddHHmmssZ"]; 

      NSDate *dt=[formatter dateFromString:DT]; 

      myEvent.startDate=dt; 
      [formatter release]; 

dt這裏的回報是NULL,我做錯了什麼?

更新後的代碼:我更新了代碼,如下所示,現在可以獲取日期,但需要詢問,是否需要設置區域設置或時區?

 [NSTimeZone resetSystemTimeZone]; 
     NSLocale *enUSPOSIXLocale; 
     NSDateFormatter *sRFC3339DateFormatter = [[NSDateFormatter alloc] init];  

     if([Result characterAtIndex:[Result length]-2] == 'Z') 
     { 
      NSLog(@"in 1"); 
      [sRFC3339DateFormatter setDateFormat:@"yyyyMMdd'T'HHmmss"]; 
     } 
     else 
     { 
      NSLog(@"in 2"); 
      [sRFC3339DateFormatter setDateFormat:@"yyyyMMdd'T'HHmmssZ"]; 
     } 

     NSDate *date = [sRFC3339DateFormatter dateFromString:[Result substringToIndex:[Result length]-2]]; 

     myEvent.startDate=date; 

回答

2

看看你的格式:

[formatter setDateFormat:@"yyyyMMddHHmmssZ"]; 

現在來看一個例子字符串:

20120704T073000Z 

你錯過了T.我不知道它是否需要逃避,所以你可能想要這些:

[formatter setDateFormat:@"yyyyMMddTHHmmssZ"]; 
[formatter setDateFormat:@"yyyyMMdd'T'HHmmssZ"]; 

請注意,末尾的Z表示「UTC」 - 我不知道iOS是否會自動考慮這一點,但它至少意味着將時區設置爲默認時區是誤導性的。我將它設置爲UTC或根本不設置。

+0

@john謝謝你的答案我更新了我的代碼,所以現在我需要設置區域設置或時區? – 2012-08-04 09:08:32

+0

@HBastan:我對蘋果API肯定不夠了解,但我會*建議*將語言環境設置爲某些「不變」語言環境(或者美國英語,如果沒有這種情況),並設置時區到UTC。請注意,對於沒有「Z」的值,該值表示一個* local *日期/時間 - 因此您應該使用vcal條目中指定的時區。是的,它變得棘手... – 2012-08-04 10:02:44

0

@Jon是的,你是對的,這裏是我爲他們指定了一個Z的實體,我設置了時區到GMT和計算Datentime是基於此接收的,而不包含Z但直接時間偏移的條目這種情況下,我不需要指定任何時區,格式化程序處理它。

NSDateFormatter *sRFC3339DateFormatter = [[NSDateFormatter alloc] init];  

     if([Result rangeOfString:@"Z"].location != NSNotFound) 
     { 
      Result=[Result substringToIndex:[Result length]-2]; 
      [sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; 
      [sRFC3339DateFormatter setDateFormat:@"yyyyMMdd'T'HHmmss"]; 
     } 
     else 
     { 

      [sRFC3339DateFormatter setDateFormat:@"yyyyMMdd'T'HHmmssZ"]; 
     } 

     NSDate *date = [sRFC3339DateFormatter dateFromString:Result]; 

     myEvent.startDate=date; 

     [sRFC3339DateFormatter release];