31

我有一个来自服务器的时间戳,如下所示:

2013-04-18T08:49:58.157+0000

我试过删除冒号,我试过所有这些:

将 ISO 8601 时间戳转换为 NSDate:如何处理 UTC 时间偏移?

为什么 NSDateFormatter 无法解析 ISO 8601 格式的日期

这是我所在的位置:

+ (NSDate *)dateUsingStringFromAPI:(NSString *)dateString {


    NSDateFormatter *dateFormatter;
    dateFormatter = [[NSDateFormatter alloc] init];

    //@"yyyy-MM-dd'T'HH:mm:ss'Z'" - doesn't work
    //@"yyyy-MM-dd'T'HH:mm:ssZZZ" - doesn't work
    //@"yyyy-MM-dd'T'HH:mm:sss" - doesn't work 

    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

    // NSDateFormatter does not like ISO 8601 so strip the milliseconds and timezone
    dateString = [dateString substringWithRange:NSMakeRange(0, [dateString length]-5)];

    return [dateFormatter dateFromString:dateString];
}

我最大的问题之一是,我上面的日期格式真的是 ISO 8601 吗?我从人们那里看到的所有示例,每个示例的格式都略有不同。有的有...157-0000,有的最后什么都没有。

4

4 回答 4

63

这对我有用:

NSString *dateString = @"2013-04-18T08:49:58.157+0000";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
// Always use this locale when parsing fixed format date strings
NSLocale *posix = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[formatter setLocale:posix];
NSDate *date = [formatter dateFromString:dateString];
NSLog(@"date = %@", date);
于 2013-07-09T22:49:59.637 回答
18

Apple 推出了新的 API!NSISO8601DateFormatter

NSString *dateSTR = @"2005-06-27T21:00:00Z";
NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];
NSDate *date = [formatter dateFromString:dateSTR];
NSLog(@"%@", date);
于 2016-09-27T00:03:58.463 回答
2

我也有原生 API,它更干净......这是我在 DateTimeManager 类中得到的实现:

+ (NSDate *)getDateFromISO8601:(NSString *)strDate{

    NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];
    NSDate *date = [formatter dateFromString: strDate];
    return date;
}

只需复制并粘贴该方法,就可以了。好好享受!

于 2017-05-29T12:41:06.080 回答
0

对我有用的完美和最佳解决方案是:

let isoFormatter = ISO8601DateFormatter();
isoFormatter.formatOptions = [ISO8601DateFormatter.Options.withColonSeparatorInTime,
                                      ISO8601DateFormatter.Options.withFractionalSeconds,
                                      ISO8601DateFormatter.Options.withFullDate,
                                      ISO8601DateFormatter.Options.withFullTime,
                                      ISO8601DateFormatter.Options.withTimeZone]
let date = isoFormatter.date(from: dateStr);

更多细节可以参考苹果官方文档:https ://developer.apple.com/documentation/foundation/nsiso8601dateformatter

于 2019-02-22T12:22:09.317 回答