如何使用以下格式将NSString转换为NSDate:“2012-08-01T12:43:35 + 02:00”?

时间:2012-08-04 16:23:39

标签: objective-c ios date

我需要像这样转换NSString:“2012-08-01T12:43:35 + 02:00”到NSDate,但我找不到好的格式......

我使用此类别代码将NSString转换为NSDate:

[NSDate dateFromString:@"2012-08-01T12:43:35+02:00" withFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"];

+ (NSDate*) dateFromString:(NSString*)dateString withFormat:(NSString*)format 
{
    return [self dateFromString:dateString withFormat:format andLocaleIdentifier:@"fr"];
}

+ (NSDate*) dateFromString:(NSString*)dateString withFormat:(NSString*)format andLocaleIdentifier:(NSString*)localeIdentifier
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];    
    [dateFormatter setDateFormat:format];
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];

    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];
    [dateFormatter setLocale:locale];
    [locale release];

    NSDate *returnDate = [dateFormatter dateFromString:dateString];
    [dateFormatter release];

    return returnDate;
}

我尝试了所有格式,但没有人是正确的......

yyyy-MM-dd'T'HH:mm:ss >> 2012-08-04T18:05:14个
yyyy-MM-dd'T'HH:mm:ssv >> 2012-08-04T18:05:14法国时间
yyyy-MM-dd'T'HH:mm:ssvv >> 2012-08-04T18:05:14GMT + 02:00
yyyy-MM-dd'T'HH:mm:ssvvv >> 2012-08-04T18:05:14GMT + 02:00
yyyy-MM-dd'T'HH:mm:ssV > 2012-08-04T18:05:14CEST
yyyy-MM-dd'T'HH:mm:ssVV > 2012-08-04T18:05:14GMT + 02:00
yyyy-MM-dd'T'HH:mm:ssVVV > 2012-08-04T18:05:14GMT + 02:00
yyyy-MM-dd'T'HH:mm:ssVVVV > 2012-08-04T18:05:14法国时间
yyyy-MM-dd'T'HH:mm:ssz >> 2012-08-04T18:05:14GMT + 02:00
yyyy-MM-dd'T'HH:mm:sszz >> 2012-08-04T18:05:14GMT + 02:00
yyyy-MM-dd'T'HH:mm:sszzz >> 2012-08-04T18:05:14GMT + 02:00
yyyy-MM-dd'T'HH:mm:sszzzz >> 2012-08-04T18:05:14中欧夏令时间 yyyy-MM-dd'T'HH:mm:ssZ >> 2012-08-04T18:05:14 + 0200
yyyy-MM-dd'T'HH:mm:ssZZ > 2012-08-04T18:05:14 + 0200
yyyy-MM-dd'T'HH:mm:ssZZZ > 2012-08-04T18:05:14 + 0200
yyyy-MM-dd'T'HH:mm:ssZZZZ > 2012-08-04T18:05:14GMT + 02:00

我该怎么办?


[编辑]第一个难看的解决方案:

  1. 使用正则表达式删除最后一个冒号
  2. 使用以下格式转换字符串“yyyy-MM-dd'T'HH:mm:ssZZZ”
  3. 有正则表达式

        NSString* dateString = @"2012-08-01T12:43:35+02:00";
        NSMutableString* dateWithoutColonString = [dateString mutableCopy];
    
        NSRegularExpression* lastColonRegex = [NSRegularExpression
                                               regularExpressionWithPattern:@"([\\+\\-][0-9][0-9]):"
                                               options:NSRegularExpressionCaseInsensitive
                                               error:nil];
    
        [lastColonRegex replaceMatchesInString:dateWithoutColonString
                                  options:NSRegularExpressionCaseInsensitive
                                    range:NSMakeRange(0, [dateString  length])
                             withTemplate:@"$1"];
    

2 个答案:

答案 0 :(得分:1)

使用[formatter setDateFormat:@“yyyy-MM-dd'T'HH:mm:ssZZZZZ”];

答案 1 :(得分:0)

Apple讨论了parsing Internet-style dates,它与您的代码类似,但有一些更改。它始终使用en_US_POSIX区域设置,并使用[NSTimeZone timeZoneForSecondsFromGMT:0]而不是您的本地时区进行解析。试一试,看看结果是否适合你。