【问题标题】:Parsing Multiple Date Formats [duplicate]解析多种日期格式
【发布时间】:2013-01-09 20:12:29
【问题描述】:

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

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

RSS 内容总是将时间列为时间:日期/时间到结束时间。我首先扫描 RSS 中的每个项目,以了解“时间:”和“到”部分之间的内容。然后我设置了一个 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];
}

【问题讨论】:

  • @ACB 我不明白您链接到的那个问题中给出的答案。在解析 RSS 中的所有其他内容时如何调用该方法?
  • 不要在问题中使用日期格式化程序,而是需要将其用作[self dateStringFromString:substring destinationFormat:@"dd-MM-yyyy"]); 在这里您可以定义您想要的任何目标格式或将其转换为 NSDate 并使用它。该方法定义已经存在于接受的答案中。您可能必须在其中包含可能的日期格式。
  • 我根本没有关注你@ACB 发布一些东西作为答案怎么样,这样我就可以比 cmets 允许的更好地看到它。
  • 检查我的答案。我使用了相同的方法,但修改为返回 NSDate 而不是 NSString。

标签: ios nsdate nsdateformatter nsscanner


【解决方案1】:

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

【讨论】:

  • 谢谢。我设置了 ~NSDate *dateFromString = [self dateFromSourceString:substring];~ 错误,它只返回当前时间。这行得通!
  • 最后一期出现了。我认为每个项目都包含时间的基本格式:日期时间到时间。似乎他们中的一些人只是有日期而没有时间。由于这些不包含“to”一词,因此它们不会被添加到子字符串中,并且永远不会解析日期。对此有何建议?
  • 有没有其他的分隔符来代替to?像点左右的东西?
  • 似乎条目的显示方式有 3 种可能性:1。时间:到结束时间的日期/时间。 2. 时间:日期 地点:事件状态:3. 时间:日期 事件状态:只是不知道如何告诉扫描仪检查它们而不是返回 null。
  • 他们都有年份,但我不想将其限制为一年,因为有些条目仍然是 2012 年,有些是 2013 年,有些可能是 2014 年
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多