我正在尝试使用NSDateFormatter来解析这两种格式的日期
@"2013-02-01T14:21:00"
或
@"2013-02-01T14:21:56.345"
目前,我使用下面的方法来解析字符串并返回日期:
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视为可选的?
谢谢你的帮忙
发布于 2017-01-16 17:05:08
从ISO10中开始,正确的方法是使用专门创建的ISO8601DateFormatter
来处理iOS 8601日期字符串的所有变体。请参考下面的示例:
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版本:
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];
发布于 2016-02-26 16:59:55
我写了一个通用解析器,它丢弃了毫秒级的部分。
@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
https://stackoverflow.com/questions/14877489
复制相似问题