Невозможно отформатировать дату UTC с помощью NSDateFormatter

#iphone #objective-c #cocoa-touch #nsdate #nsdateformatter

#iPhone #objective-c #cocoa-touch #nsdate #nsdateformatter

Вопрос:

У меня есть следующая дата:

 2011-10-20T01:10:50Z
  

Я бы хотел, чтобы он был отформатирован в

 "M/d/yy 'at' h:mma"
  

Вот мой код:

 NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    //The Z at the end of your string represents Zulu which is UTC
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
    [dateFormatter setDateFormat:@"yyyy-dd-MM'T'HH:mm:ss'Z'"];
    NSDate* newTime = [dateFormatter dateFromString:[message valueForKey:@"created_at"]];

    //Add the following line to display the time in the local time zone
    [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
    [dateFormatter setDateFormat:@"M/d/yy 'at' h:mma"];
    NSString* finalTime = [dateFormatter stringFromDate:newTime];
    [dateFormatter release];
    NSLog(@"%@", finalTime);    
  

К сожалению, finalTime здесь равно нулю.

Ответ №1:

У вас есть dd-MM в обратном направлении. У вас есть 10 для dd и 20 мм. Нет месяца 20.

 2011-10-20T01:10:50Z
@"yyyy-dd-MM'T'HH:mm:ss'Z'"
  

Из-за этого newTime было null, а finalTime было null.

Вот с исправлением. Это:

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

//The Z at the end of your string represents Zulu which is UTC
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];

NSDate* newTime = [dateFormatter dateFromString:@"2011-10-20T01:10:50Z"];
NSLog(@"original time: %@", newTime);

//Add the following line to display the time in the local time zone
[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
[dateFormatter setDateFormat:@"M/d/yy 'at' h:mma"];
NSString* finalTime = [dateFormatter stringFromDate:newTime];
NSLog(@"%@", finalTime);    

[dateFormatter release];
  

Выводит:

 2011-10-19 22:05:15.107 Craplet[4231:707] original time: 2011-10-20 01:10:50  0000
2011-10-19 22:05:15.116 Craplet[4231:707] 10/19/11 at 9:10PM
  

Комментарии:

1. 1 для dateFormatter setTimeZone . Это то, что мне нужно было знать. 🙂

Ответ №2:

Это техническое примечание помогло мне решить ту же проблему: https://developer.apple.com/library/ios/qa/qa1480/_index.html

В двух словах, вам нужно установить 3 параметра в NSDateFormatter:

  1. Язык
  2. Часовой пояс
  3. Формат даты

пример кода:

 NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
[dateFormatter setLocale:locale];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'"];

NSDate *date = [dateFormatter dateFromString:@"2014-10-23T01:10:50.000Z"];
  

Я использовал NSDateFormatter для успешного анализа строк UTC в NSDate, установив только часовой пояс и формат даты. Когда он внезапно перестал работать, я нашел эту техническую заметку и добавил setLocal: что решило проблему для меня.

Ответ №3:

Потому что Swift:

 let dateFormatter = NSDateFormatter()
dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
let dateHopefully = dateFormatter.dateFromString("2016-07-29T17:15:02Z")

dateFormatter.timeZone = NSTimeZone.systemTimeZone()
dateFormatter.dateFormat = "M/d/yy 'at' h:mma"
let lastTime = dateFormatter.stringFromDate(dateHopefully!)

print("Here is the hopeful date (dateHopefully) and here is the lastTime (lastTime)")