我输入以下字符串:
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;
答案 0 :(得分:2)
看看你的格式:
[formatter setDateFormat:@"yyyyMMddHHmmssZ"];
现在看一个示例字符串:
20120704T073000Z
你错过了T.我不知道它是否需要转义,所以你可能想要其中任何一个:
[formatter setDateFormat:@"yyyyMMddTHHmmssZ"];
[formatter setDateFormat:@"yyyyMMdd'T'HHmmssZ"];
请注意,最后的Z
表示“UTC” - 我不知道iOS是否会自动考虑到这一点,但它至少意味着将时区设置为默认时区是误导。我将它设置为UTC或根本不设置。
答案 1 :(得分:0)
@Jon是的你是对的,这就是我为他们指定Z的entires我将时区设置为GMT并且基于此接收计算的Datentime,而不包含Z但直接在时间偏移中的条目case我不需要指定任何时区,格式化程序处理它。
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];