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

时间:2011-03-03 19:03:11

标签: nsdate utc iso

我无法将 ISO 8601 时间戳转换为NSDate。我尝试使用NSDateFormatter,但我无法使用时间戳结尾处显示的 UTC 时间偏移量。要解释一下,我想将以下时间戳转换为NSDate2011-03-03T06:00:00-06:00。我的问题是:我如何处理“-06:00”部分?我尝试使用yyyy-MM-dd'T'HH:mm:ssZ作为我的日期格式字符串,但它不起作用。有什么建议吗?

6 个答案:

答案 0 :(得分:59)

无需删除:'s。要处理“00:00”样式时区,您只需要“ZZZZ”:

<强>夫特

let dateString = "2014-07-06T07:59:00Z"

let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZ"
dateFormatter.dateFromString(dateString)

<强>目标C

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
dateFormat.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
NSString *input = @"2013-05-08T19:03:53+00:00";
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"]; //iso 8601 format
NSDate *output = [dateFormat dateFromString:input];
NSLog(@"Date output: %@", output);

答案 1 :(得分:18)

就我而言,我收到了类似的内容:

“2015-05-07T16:16:47.054403Z”

我不得不使用:

“YYYY ' - ' MM ' - ' dd'T'HH ':' 毫米 ':' ss.SSSZ”

答案 2 :(得分:5)

问题是时区偏移内的:字符。您可以只显式删除该冒号,或删除所有冒号,然后继续。例如:

NSString *s = @"2011-03-03T06:00:00-06:00";
s = [s stringByReplacingOccurrencesOfString:@":" withString:@""];
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd'T'HHmmssZZ"];
NSDate *d = [f dateFromString:s];
NSLog(@"%@", d);

此日志:

EmptyFoundation[5088:707] 2011-03-03 12:00:00 +0000

答案 3 :(得分:4)

以下是我使用的方法:

-(NSDate *)dateFromISO8601String:(NSString *)dateString{
    if (!dateString) return nil;
    if ([dateString hasSuffix:@"Z"]) {
      dateString = [[dateString substringToIndex:(dateString.length-1)] stringByAppendingString:@"-0000"];
    }
    dateString = [dateString stringByReplacingOccurrencesOfString:@":" withString:@""];
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HHmmssZ";
    return [dateFormatter dateFromString:dateString];
}

答案 4 :(得分:3)

在Swift中将ISO 8601时间戳转换为NSDate:

let dateFormatter = NSDateFormatter()
let inputDate = "2015-06-18T19:00:53-07:00"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZ" //iso 8601

let outputDate = dateFormatter.dateFromString(inputDate)
println(outputDate!) //optional implicitly

或显式选择:

if let outputDate = dateFormatter.dateFromString(inputDate) {
     println(outputDate) //no need !
}

答案 5 :(得分:0)

Apple支持separate format for ISO 8601 format

目标C

NSISO8601DateFormatter *formater = [[NSISO8601DateFormatter alloc]init];
NSString *string = [formater stringFromDate:[NSDate date]];