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条目中指定的时区。是的,它变得很棘手。。。