Преобразование метки времени ISO 8601 в NSDate: как справиться со смещением времени UTC? - PullRequest
37 голосов
/ 03 марта 2011

У меня проблемы с преобразованием отметки времени ISO 8601 в NSDate.Я пытался использовать NSDateFormatter, но не могу заставить его работать со смещением времени UTC , которое появляется в конце отметок времени.Чтобы объяснить, я хотел бы преобразовать метку времени, такую ​​как следующее, в NSDate: 2011-03-03T06:00:00-06:00.Мой вопрос: как мне разобраться с частью "-06: 00"?Я попытался использовать yyyy-MM-dd'T'HH:mm:ssZ в качестве строки формата даты, но это не работает.Есть предложения?

Ответы [ 5 ]

60 голосов
/ 09 мая 2013

Нет необходимости удалять: 's. Для обработки часового пояса в стиле "00:00" вам просто нужно "ZZZZ":

Swift

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)

Objective-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);
18 голосов
/ 12 мая 2015

В моем случае я получил что-то подобное:

"2015-05-07T16: 16: 47.054403Z"

И мне пришлось использовать:

"гггг'-'MM' - 'dd'T'HH': 'мм': 'ss.SSSZ "

5 голосов
/ 17 сентября 2011

Проблема в символе : внутри смещения часового пояса.Вы можете явно удалить только это двоеточие или удалить все двоеточия, а затем продолжить.Например:

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
4 голосов
/ 22 сентября 2012

Вот метод, который я использую:

-(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];
}
3 голосов
/ 19 июня 2015

Преобразование метки времени ISO 8601 в NSDate In Swift:

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 !
}
...