У меня возникла проблема с преобразованием метки ISO 8601 в NSDate
. Я попытался использовать NSDateFormatter
, но я не могу заставить его работать со временным смещением UTC, которое появляется в конце временных меток. Чтобы объяснить, я хотел бы преобразовать временную метку, такую как следующее, в NSDate
: 2011-03-03T06:00:00-06:00
. Мой вопрос: как я могу справиться с частью "-06: 00"? Я пытался использовать yyyy-MM-dd'T'HH:mm:ssZ
в качестве строки формата даты, но это не работает. Любые предложения?
Преобразование метки времени ISO 8601 в NSDate: как вы работаете с временным смещением UTC?
Ответ 1
Не нужно удалять:. Чтобы обрабатывать часовой пояс стиля "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);
Ответ 2
В моем случае я получил что-то вроде этого:
"2015-05-07T16: 16: 47.054403Z"
И мне пришлось использовать:
"гггг '-' MM '-' dd'T'HH ':' мм ':' ss.SSSZ"
Ответ 3
Проблема заключается в символе :
внутри смещения часового пояса. Вы можете явно удалить только этот двоеточие или удалить все двоеточия, а затем продолжить. Например:
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
Вот метод, который я использую:
-(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];
}
Ответ 5
Преобразование метки времени 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 !
}