Parsing Vcal日期解析问题
我将以下字符串作为输入:Parsing Vcal日期解析问题,parsing,null,timezone,nsdateformatter,vcalendar,Parsing,Null,Timezone,Nsdateformatter,Vcalendar,我将以下字符串作为输入: 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"];
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
这里返回的值为空,我做错了什么
更新代码:我更新代码如下,现在我可以得到日期,但需要问,我需要设置地区或时区
[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;
看看你的格式:
[formatter setDateFormat:@"yyyyMMddHHmmssZ"];
现在看一个示例字符串:
20120704T073000Z
你错过了T。我不知道它是否需要逃走,所以你可能想要以下任何一个:
[formatter setDateFormat:@"yyyyMMddTHHmmssZ"];
[formatter setDateFormat:@"yyyyMMdd'T'HHmmssZ"];
请注意,末尾的
Z
表示“UTC”-我不知道iOS是否会自动将其考虑在内,但它至少意味着将时区设置为默认时区会产生误导。我会将其设置为UTC或根本不设置。@Jon是的,你是对的,这里是我所做的。为它们指定一个Z的实体我将时区设置为GMT,并根据该设置接收计算的日期时间,而不包含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];
@john谢谢你的回答我更新了我的代码如上所述,所以现在我需要设置区域设置还是时区???@HBastan:我对Apple API的了解还不足以确定,但我建议将区域设置设置为一些“不变”的区域设置(如果没有这样的设置,则为美式英语),并将时区设置为UTC。请注意,对于没有
Z
的值,该值表示本地日期/时间-因此应使用vcal条目中指定的时区。是的,它变得很棘手。。。