首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用带有可选毫秒部分的NSDateFormatter解析ISO8601

如何使用带有可选毫秒部分的NSDateFormatter解析ISO8601
EN

Stack Overflow用户
提问于 2013-02-14 22:52:21
回答 2查看 6.3K关注 0票数 19

我正在尝试使用NSDateFormatter来解析这两种格式的日期

代码语言:javascript
复制
@"2013-02-01T14:21:00"

代码语言:javascript
复制
@"2013-02-01T14:21:56.345"

目前,我使用下面的方法来解析字符串并返回日期:

代码语言:javascript
复制
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];

[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
NSDate *date = [dateFormatter dateFromString:dateToFormat];

这适用于第一种样式的日期,但对于包含毫秒部分的字符串,则返回nil。

我想我可以测试毫秒的存在并剥离它们,但我想知道我是否可以更改日期格式以将.SSS视为可选的?

谢谢你的帮忙

EN

回答 2

Stack Overflow用户

发布于 2017-01-16 17:05:08

从ISO10中开始,正确的方法是使用专门创建的ISO8601DateFormatter来处理iOS 8601日期字符串的所有变体。请参考下面的示例:

代码语言:javascript
复制
let date = Date()
var string: String

let formatter = ISO8601DateFormatter()
string = formatter.string(from: date)

let GMT = TimeZone(abbreviation: "GMT")
let options: ISO8601DateFormatOptions = [.withInternetDateTime, .withDashSeparatorInDate, .withColonSeparatorInTime, .withTimeZone]
string = ISO8601DateFormatter.string(from: date, timeZone: GMT, formatOptions: options)

和Objective-C版本:

代码语言:javascript
复制
NSDate *date = [NSDate date];
NSString *string;

NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];
string = [formatter stringFromDate:date];

NSTimeZone *GMT = [NSTimeZone timeZoneWithAbbreviation: @"GMT"];
NSISO8601DateFormatOptions options = NSISO8601DateFormatWithInternetDateTime | NSISO8601DateFormatWithDashSeparatorInDate | NSISO8601DateFormatWithColonSeparatorInTime | NSISO8601DateFormatWithTimeZone;
string = [NSISO8601DateFormatter stringFromDate:date timeZone:GMT formatOptions:options];
票数 2
EN

Stack Overflow用户

发布于 2016-02-26 16:59:55

我写了一个通用解析器,它丢弃了毫秒级的部分。

代码语言:javascript
复制
@implementation JSONModel(NSPAdditions)

- (NSDate *)NSDateFromNSString:(NSString*)string {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
    NSArray* parts = [string componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@" T"]];
    if ([parts count] <= 1) {
        return [formatter dateFromString:string];
    }
    NSString *part0 = parts[0];
    NSAssert([part0 length] == [@"yyyy-MM-dd" length], @"Date format error");
    NSString *part1 = parts[1];
    if ([part1 length] > [@"HH:mm:ss" length]) {
        part1 = [part1 substringToIndex:[@"HH:mm:ss" length]];
    }
    NSString *fmted = [NSString stringWithFormat:@"%@ %@", part0, part1];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    return [formatter dateFromString:fmted];
}

@end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14877489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档