2

可能重复:
在 iPhone 中将多种日期格式转换为单一格式

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

RSS 内容总是将时间列为时间:日期/时间到结束时间。我首先扫描 RSS 中的每个项目,以获取介于 When: 和 'to' 部分之间的内容。然后我设置了一个 NSDateFormatter。这就是问题所在。有时它被列为 2013 年 9 月 6 日星期四下午 1:00,但在其他时候,使用的格式是 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];
}
4

2 回答 2

3

在 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。这可以用于您的情况。

于 2013-01-25T19:49:27.600 回答
0

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

继续由每个日期格式化程序一一转换,直到转换后的日期不是null. 由于无效格式将无法转换并返回 null。

于 2013-01-25T19:47:34.190 回答