iPhone-如何将日期字符串解析为iOS中的NSDate对象?

我正在尝试将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 ];
}

任何帮助,不胜感激。 谢谢!

**根据来自ChrisKent的链接参考,我解决了如下问题:

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];

}
7个解决方案
64 votes

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

[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]

使用冒号处理TimeZones(+00:00):[http://petersteinberger.com/2010/05/nsdateformatter-and-0000-parsing/]

theChrisKent answered 2020-02-21T21:29:50Z
3 votes

最后,我在结肠上也遇到了同样的问题。 这是我用来标准化日期以使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:@""];
}
Anurag answered 2020-02-21T21:30:10Z
3 votes

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

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

您可以将日期格式设置为

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

这样可以正确处理冒号“ -05:00”。

ucangetit answered 2020-02-21T21:30:44Z
1 votes

解决方案是改变:

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

对于这个符号:

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

希望对您有帮助。

Badre answered 2020-02-21T21:31:12Z
1 votes

ISO8601DateFormatter

我已经以CocoaPod的形式获得了这个库的巨大成功。

[HTTPS://GitHub.com/铂热电阻哦/ISO-8601-达特-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"];
Cameron Lowell Palmer answered 2020-02-21T21:31:45Z
1 votes

问题是末尾的“ Z”。 在用引号引起来的书写方式中,解析器期望时间字符串中的文字字符Z,但没有一个。 您想要的是不带引号的Z格式字符,它表示您的时间字符串包含时区信息。 为此,字符串末尾的-05:00是时区。

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

gnasher729 answered 2020-02-21T21:32:11Z
0 votes

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

BergQuester answered 2020-02-21T21:32:31Z
translate from https://stackoverflow.com:/questions/4999396/how-to-parse-a-date-string-into-an-nsdate-object-in-ios