【问题标题】:How to parse varied string dates如何解析不同的字符串日期
【发布时间】:2013-04-17 09:24:37
【问题描述】:

在我的应用程序中,我使用 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];

问题是:如何调整以上所有内容的日期格式? 有什么功能还是我应该手动做?

提前致谢!

【问题讨论】:

  • 最好的方法是给 pubDate 一个单独的 dateFormat,如果你不能这样做的话。编写一个循环,继续尝试可能的 dateFormats 直到 dateFormatter 形成有效日期。
  • 是的,我知道最好的方法是提供单个 dateFormat。但正如我所说,我从解析的 xml 中有很多 dateFormat,所以我需要找到一种方法来处理它们..

标签: ios xcode nsdate nsxmlparser nsdateformatter


【解决方案1】:

这不是一个理想的解决方案,但应该可以工作,因为没有关于时区的任何信息的 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);

【讨论】:

  • 谢谢你..我已经做了一些这样的想法..但是这种格式:yyyy-MM-dd'T'HH:mm:ss 不起作用..有什么想法吗?
  • @OshriALM 我在测试后发布了代码,它适用于您提到的所有格式。你能提供失败时的 dateString 是什么吗?
  • 当我调试时我可以看到字符串来自 xml 是:“2013-04-17T13:11:44.0/n”我不知道 '/n' 来自哪里.. 但是它的回报为零
  • @OshriALM 你能把格式改成 yyyy-MM-dd'T'HH:mm:ss.s
  • 已经试过了,还是不行。也许是 '/n' 的问题。
猜你喜欢
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 2020-07-26
  • 2011-06-08
  • 2011-07-21
相关资源
最近更新 更多