2011-10-20 3 views
16

У меня есть следующие даты:Невозможно отформатировать дату UTC с 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 здесь NULL.

ответ

30

У вас есть dd-MM назад. У вас есть 10 для dd и 20 MM. Существует не месяц 20.

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

Из-за этого, новыйTime был 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 
+8

Интересное имя для вашего тестового приложения там в журналах! –

+1

+1 для 'dateFormatter setTimeZone'. Это то, что мне нужно было знать. :) – devios1

14

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

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

  1. Местность
  2. TimeZone
  3. DateFormat

Пример кода:

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)") 
Смежные вопросы