解析多个日期格式

时间:2013-01-25 19:28:36

标签: ios nsdate nsdateformatter nsscanner

  

可能重复:
  Converting mutliple date format into a single format in iPhone

我正在尝试解析RSS并从RSS的内容部分提取日期的NSString,并将其转换为NSDate。以下是我到目前为止的情况:

RSS内容始终将时间列为时间:日期/时间到结束时间。我首先扫描RSS中的每个项目,以获取When:和'to'部分之间的内容。然后我设置了一个NSDateFormatter。这是问题所在。有时它被列为2013年9月6日星期四下午1点,但在其他时候,使用的格式是2013年9月6日星期四下午1点。所以...我需要解决的问题是设置一些内容,这样无论日期的格式如何,它都能够返回一些东西,因为现在使用“EEE MMM dd,yyyy h:mma”会遗漏出实例只是说下午1点。

NSMutableArray *substrings = [NSMutableArray new];
NSScanner *scanner = [NSScanner scannerWithString:articleImage];
[scanner scanUpToString:@"When: " intoString:nil]; // Scan all characters before #

NSString *substring = nil;
[scanner scanString:@"When: " intoString:nil]; // Scan the # character
if([scanner scanUpToString:@" to" intoString:&substring]) {
    // If the space immediately followed the #, this will be skipped
    //[substrings addObject:substring];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    // this is imporant - we set our input date format to match our input string
    // if format doesn't match you'll get nil from your string, so be careful
    [dateFormatter setDateFormat:@"EEE MMM dd, yyyy h:mma"];
    NSDate *dateFromString = [[NSDate alloc] init];
    // voila!
    dateFromString = [dateFormatter dateFromString:substring];
    self.thetruedate = dateFromString;
    [dateFormatter release];
    NSLog(@"%@",dateFromString);
    [substrings release];
}

2 个答案:

答案 0 :(得分:2)

在RSS中定义一个包含所有可能日期格式的方法,

- (NSDate *)dateFromSourceString:(NSString *)sourceString {

    NSDate *convertedDate = nil;
    NSArray *dateFormatterList = [NSArray arrayWithObjects:@"EEE MMM dd, yyyy h:mma", 
                                  @"EEE MMM dd, yyyy ha", nil];//include all possible dateformats here

    //sourceString = @"Thu Sep 6, 2013 1:00PM";

    if (sourceString) {

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

        for (NSString *dateFormatterString in dateFormatterList) {

            [dateFormatter setDateFormat:dateFormatterString];
            NSDate *originalDate = [dateFormatter dateFromString:sourceString];

            if (originalDate) {

                convertedDate = originalDate;
                NSLog(@"Converted date is %@", convertedDate);
                break;
            }
        }
       [dateFormatter release]; //release it if it is a non-arc project
    }

    return convertedDate;
}

然后将其用作

NSMutableArray *substrings = [NSMutableArray new];
NSScanner *scanner = [NSScanner scannerWithString:articleImage];
[scanner scanUpToString:@"When: " intoString:nil]; // Scan all characters before #

NSString *substring = nil;
[scanner scanString:@"When: " intoString:nil]; // Scan the # character
if([scanner scanUpToString:@" to" intoString:&substring]) {
    // If the space immediately followed the #, this will be skipped
    //[substrings addObject:substring];

    // this is imporant - we set our input date format to match our input string
    // if format doesn't match you'll get nil from your string, so be careful

    NSDate *dateFromString = [self dateFromSourceString:substring];
    self.thetruedate = dateFromString;
    NSLog(@"%@",dateFromString);
    [substrings release];
}

dateFromSourceString方法将从dateFormatterList中选择日期格式化程序,并尝试转换为日期。如果格式不正确,则返回nil。这可以在您的情况下使用。

答案 1 :(得分:0)

您可以在RSS中创建所有可能的日期格式类型。

继续逐个转换每个日期格式器,直到转换日期不是null。由于无效格式无法转换并返回null。

相关问题