Дата JSON для выпуска NSDate

У меня есть строка даты в формате JSON, она выглядит так: 2013-05-22T10: 54: 40.437

И я'Я пытаюсь преобразовать его в NSDate.

- (NSString *)dateFromString:(NSString *)datestring{
    // Convert string to date object
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss"];

    NSDate *date = [dateFormat dateFromString:datestring];
    //date is nil here.
    NSDateFormatter *newDateFormatter = [[NSDateFormatter alloc]init];
    [newDateFormatter setDateFormat:@"MM/dd/yyyy"];
    NSString *newString = [newDateFormatter stringFromDate:date];
    NSLog(@"Date -- %@",datestring);


    return newString;
}

Но дата равна нулю после dateFromString. Кто-нибудь знает, что я тут не так сделал? Спасибо!

 Desdenova23 мая 2013 г., 15:36
потерять одинарные кавычки в строке
 Desdenova23 мая 2013 г., 16:52
@ikinciviking спасибо
 vikingosegundo23 мая 2013 г., 16:00
@Desdenova: версия, на которую вы ссылаетесь, довольно старая, она действительно используется в iOS6unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns
 Desdenova23 мая 2013 г., 15:37
и проверьте свой формат здесьunicode.org/reports/tr35/tr35-6.html#Date%5FFormat%5FPatterns

Ответы на вопрос(4)

Ваш формат даты неверен. Так должно быть:

[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss:SSS"];

Три столицы 'S' означает, что дробная часть займет до 3 цифр. Отрегулируйте это как хотите.

-(void)viewDidLoad {

    self.date = [dateForRFC3339DateTimeString:@"2015-01-18T01:00:00.000Z"];

}


-(NSDate *)dateForRFC3339DateTimeString:(NSString *)rfc3339DateTimeString {

    NSDateFormatter *rfc3339DateFormatter = [[NSDateFormatter alloc] init];

    [rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'"];
    [rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    // Convert the RFC 3339 date time string to a NSDate.
    NSDate *result = [rfc3339DateFormatter dateFromString:rfc3339DateTimeString];
    return result;
} 
Решение Вопроса

Используйте этот формат даты:

yyyy-MM-dd'T'HH:mm:ss.SSS

Ваш код с небольшими изменениями:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS"];

NSDate *date = [dateFormat dateFromString:datestring];
NSDateFormatter *newDateFormatter = [[NSDateFormatter alloc]init];
[newDateFormatter setDateFormat:@"MM/dd/yyyy"];
NSString *newString = [newDateFormatter stringFromDate:date];
NSLog(@"Date: %@, formatted date: %@", date, newString);

дает мне этот вывод:

Date: 2013-05-22 08:54:40 +0000, formatted date: 05/22/2013

Редактировать: как "икинчи викинг " указано в комментарии, экранирование не обязательно. Экранирование удалено из кода

Обновление для iOS 11+

ISO8601DateFormatter это рекомендуемый способ разбора интернет-даты на iOS 10+.

Однако у него есть несколько проблем, мешающих его использованию в определенном формате из вопроса:

Миллисекунды поддерживаются только на iOS 11+Это не работает для дат без часового пояса (рассматриваемый случай). Строка даты должна содержать часть часового пояса (например,+00:00 или жеZ за "Зулусское время " УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ)

Если строки даты содержат миллисекунды и часовой пояс (например,2018-09-07T14:04:13.143Z), его можно использовать следующим образом (пример Swift):

let isoDateFormatter = ISO8601DateFormatter()
isoDateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
 Lukas Kukacka23 мая 2013 г., 15:58
@ikinci Viking: Спасибо за ваше исправление. Я просто хотел сделать как можно меньше изменений, чтобы исправить код из вопроса. Но вы правы, его гораздо удобнее читать, не убегая
 Richard Topchiy25 мар. 2015 г., 05:48
Как сделать противоположную операцию? NSDate к строке JSON правильным способом?
If your date format is "2014-02-25T13:05:10+00:00" then,
your code should be like this....

    NSURL *url = [NSURL URLWithString:@"your URL"];
    NSString *str = [[NSString alloc] initWithContentsOfURL:url usedEncoding:Nil error:Nil];

    NSDateFormatter *dateFor = [[NSDateFormatter alloc] init];
    [dateFor setDateFormat:**@"yyyy-MM-dd'T'HH:mm:ss'+'SS:SS"**];

    NSDate *yourDate = [dateFor dateFromString:str];
    NSLog(@"Your Date: %@",yourDate);

Ваш ответ на вопрос