2011-10-20 9 views
16

tengo la siguiente fecha:Incapaz de formato de fecha UTC con NSDateFormatter

2011-10-20T01:10:50Z 

me gustaría que se formatee a

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

Aquí está mi código:

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);  

Lamentablemente, el tiempo final es NULO aquí.

Respuesta

30

Tiene dd-MM al revés. Tienes 10 para dd y 20 MM. No hay ningún mes 20.

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

Debido a eso, la Newtime era nula y la finalTime era nula.

Aquí está la solución. Este:

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]; 

Salidas:

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

nombre interesante para la aplicación de prueba que hay en los registros! –

+1

+1 para 'dateFormatter setTimeZone'. Eso es lo que necesitaba saber. :) – devios1

14

Esta nota técnica me ayudó a resolver el mismo problema: https://developer.apple.com/library/ios/qa/qa1480/_index.html

En pocas palabras, es necesario establecer 3 cosas en NSDateFormatter:

  1. Locale
  2. zona horaria
  3. DateFormat

ejemplo de código:

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"]; 

que estaba usando NSDateFormatter a analizar correctamente las cadenas UTC a NSDate por única configuración de zona horaria y el formato de fecha. Cuando de repente dejó de funcionar encontré esta nota técnica y agregué setLocal: lo cual resolvió el problema para mí.

3

Debido 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)") 
Cuestiones relacionadas