如何解析不同的字符串日期

如何解析不同的字符串日期

问题描述:

在我的应用程序即时通讯使用NSXMLParser解析提要。 我有一个pubdate的很好,但在许多不同的字符串日期格式:如何解析不同的字符串日期

1. 2013-04-17T12:00:24 
2. Wed, 17 Apr 2013 10:15 +0300 
3. Wed, 17 Apr 2013 11:07:01 +0200 
4. 11/04/2013 18:10:10 

这里是我的代码:

NSDateFormatter *inputFormatter = [[NSDateFormatter alloc]init]; 
    assert(inputFormatter != nil); 
    NSLocale *loacle = [[NSLocale alloc]initWithLocaleIdentifier:@"en_US_POSIX"]; 
    assert(loacle != nil); 

    [inputFormatter setLocale:loacle]; 
    [inputFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"]; 

    [inputFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

    NSString *dateString = [NSString stringWithFormat:@"%@",currentPubDate]; 
    NSDate *inputDate = [inputFormatter dateFromString:dateString]; 

    NSLocale *hebrow = [[NSLocale alloc]initWithLocaleIdentifier:@"he_IL"]; 
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc]init]; 
    outputFormatter.locale = hebrow; 
    [outputFormatter setDateStyle:NSDateFormatterFullStyle]; 
    [outputFormatter setTimeStyle:NSTimeZoneNameStyleShortStandard]; 
    NSString *outputDate = [outputFormatter stringFromDate:inputDate]; 

问题是:我如何调整日期格式上述所有的? 有任何功能,或者我应该手动吗?

在此先感谢!

+0

最好的方法是给pubDate一个dateFormat,如果你不能这样做的话。写一个循环将继续尝试可能的dateFormats,直到有效日期由dateFormatter形成。 – Anupdas

+0

是的,我知道最好的办法是给单一的dateFormat。 但正如我所说我从解析的XML许多dateFormat,所以我需要找到一种方法来处理它们.. – OshriALM

这不是一个理想的解决方案,但应该工作,因为dateString没有关于时区的任何信息是UTC。

NSString *dateString = @"11/04/2013 18:10:10"; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
NSLocale *enUSPOSIX = [[NSLocale alloc]initWithLocaleIdentifier:@"en_US_POSIX"]; 

[dateFormatter setLocale:enUSPOSIX]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

NSDate *date = nil; 
NSError *error = nil; 
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeDate 
                  error:&error]; 
NSArray *matches = [detector matchesInString:dateString 
            options:0 
             range:NSMakeRange(0, [dateString length])]; 
for (NSTextCheckingResult *match in matches) { 

    if (match.date) { 
     date = match.date; 
     break; 
    } 
} 

if (!date) { 
    NSArray *dateFormats = @[@"yyyy-MM-dd'T'HH:mm:ss", 
          @"EEE, dd MMM yyyy HH:mm Z", 
          @"EEE, dd MMM yyyy HH:mm:ss Z", 
          @"dd/MM/yyyy HH:mm:ss"]; 

    for (NSString *dateFormat in dateFormats) { 
     [dateFormatter setDateFormat:dateFormat]; 
     date = [dateFormatter dateFromString:dateString]; 
     if (date) { 
      break; 
     } 
    } 
} 


NSLocale *hebrowLocale = [[NSLocale alloc]initWithLocaleIdentifier:@"he_IL"]; 
[dateFormatter setLocale:hebrowLocale]; 
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; 
[dateFormatter setDateStyle:NSDateFormatterFullStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

NSString *formattedDateString = [dateFormatter stringFromDate:date]; 
NSLog(@"DateString : %@",formattedDateString); 
+0

谢谢..我已经做了这样的想法.. 但这种格式:yyyy-MM-dd' T'HH:mm:ss 不工作..任何想法? – OshriALM

+0

@OshriALM我在测试后发布了代码,它适用于您提到的所有格式。你能提供什么是dateString失败时。 – Anupdas

+0

当我调试我可以看到该字符串来自xml是:“2013-04-17T13:11:44.0/n”我不知道'/ n'来自哪里.. 但它的返回零 – OshriALM