【问题标题】:How to parse a date string into an NSDate object in iOS?如何将日期字符串解析为 iOS 中的 NSDate 对象?
【发布时间】:2011-06-27 07:55:27
【问题描述】:

我正在尝试将 xml 中的日期字符串解析为 iPhone 应用程序中的 NSDate 对象

我知道这之前一定有人问过,但是,我相信我的语法是正确的,但它不起作用。我的代码有问题吗?

我需要解析的日期字符串是:

2011-01-21T12:26:47-05:00

我用来解析它的代码是:

self.dateFormatter = [[NSDateFormatter alloc] init];
    [self.dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [self.dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
    [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];



... 

else if([elementName isEqualToString:kUpdated]){
    self.currentQuestion.updated = [self.dateFormatter dateFromString:self.currentParsedCharacterData ];
}

非常感谢任何帮助。谢谢!

**基于来自 theChrisKent 的链接参考,我修复了这样的问题:

else if([elementName isEqualToString:kLastOnDeck]){

    NSString *dateStr = self.currentParsedCharacterData;
    // we need to strip out the single colon
    dateStr = [dateStr stringByReplacingOccurrencesOfString:@":" 
                                                 withString:@"" 
                                                    options:0 
                                                      range:NSMakeRange([dateStr length] - 5,5)];




    self.currentQuestion.lastOnDeck = [dateFormatter dateFromString:dateStr];

}

【问题讨论】:

标签: iphone objective-c ios nsdate nsdateformatter


【解决方案1】:

您不需要尽可能多的单引号(仅在非日期/时间字符上需要),因此请更改:

[self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];

到这里:

[self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
...
self.currentQuestion.updated = [self.dateFormatter dateFromString:[self.currentParsedCharacterData stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([self.currentParsedCharacterData length] – 5,5)]];

此处的文档:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1

Unicode 格式模式:http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

用冒号处理时区 (+00:00):http://petersteinberger.com/2010/05/nsdateformatter-and-0000-parsing/

【讨论】:

  • 我发现有人问同样的问题,也没有答案:stackoverflow.com/questions/3561029/… 他们提到这可能是时区冒号的问题?
  • @JohnRock 我已经用解决方案和链接更新了我的答案。基本上,格式化程序没有设置为处理该冒号,因此您在解析之前将其删除。
  • 克里斯肯特救了我。非常感谢,您提供的最后一个链接解释了如何解决此问题。非常感谢!
  • 请注意,格式化程序标准现在支持带有冒号的时区“ZZZZZ”。
  • 对于 iOS 6 及更高版本,使用 "yyyy-MM-dd'T'HH:mm:ssZZZZZ" 格式是更好的解决方案。请在下面查看我的答案。
【解决方案2】:

最后我的冒号也有同样的问题。这是我用来标准化日期以使NSDate开心的函数。

/**
 * Timezones are returned to us in the format +nn:nn
 * The date formatter currently does not support IS 8601 dates, so
 * we convert timezone from the format "+07:30" to "+0730" (removing the colon) which
 * can then be parsed properly.
 */
- (NSString *)applyTimezoneFixForDate:(NSString *)date {
    NSRange colonRange = [date rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@":"] options:NSBackwardsSearch];
    return [date stringByReplacingCharactersInRange:colonRange withString:@""];
}

【讨论】:

  • 这看起来是一个很好的解决问题的功能。谢谢。
【解决方案3】:

我花了一段时间才找到简单的答案。并且有很多解决方案涉及引入额外的第三方代码。

对于那些正在为此苦苦挣扎并且仅支持 iOS 6 及更高版本的用户。

您可以将日期格式化程序设置为

[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"]

这将正确处理带有冒号的“-05:00”。

【讨论】:

    【解决方案4】:

    解决办法是改变:

    [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    

    到这个符号:

    [self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    

    希望对你有帮助。

    【讨论】:

    • 如果日期字符串为 0000-00-00T00:00:00 +0530,则返回 nil
    • 它的逻辑:D,所有时间都是000000,没有时间:p
    • 第 0 年不存在! BC1 的下一年是 AD1 ;-)
    • 我相信你的问题是 Z。
    【解决方案5】:

    ISO8601DateFormatter

    我在这个可作为 CocoaPod 的库上取得了巨大的成功。

    https://github.com/boredzo/iso-8601-date-formatter

    用法

    - (ISO8601DateFormatter *)dateFormatter
    {
        static ISO8601DateFormatter *dateFormatter = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            dateFormatter = [[ISO8601DateFormatter alloc] init];
            dateFormatter.includeTime = YES;
        });
    
        return dateFormatter;
    }
    
    
    NSDate *date = [[self dateFormatter] dateFromString:@"2015-05-09T13:06:00"];
    

    【讨论】:

      【解决方案6】:

      问题是最后的“Z”。您在引号中编写它的方式,您的解析器期望您的时间字符串中有一个文字字符 Z,但没有。您想要的是不带引号的 Z 格式字符,这表明您的时间字符串包含时区信息。确实如此,字符串末尾的 -05:00 是时区。

      由于您需要时区信息,因此在日期格式化程序中设置时区是毫无意义的。并检查指向 Unicode 格式模式的链接,该链接包含您应该信任的权威信息,高于您在此处获得的所有答案。

      【讨论】:

        【解决方案7】:

        从 iOS 10 开始,系统提供的 NSISO8601DateFormatter 可用于这种特定格式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-09
          • 1970-01-01
          相关资源
          最近更新 更多