2011-04-21 12 views
7

Estoy tratando de establecer el formato de fecha para algo así como "2011-04-21 03: 31: 37.310396". Creo que no estoy recibiendo los segundos fraccionales correctos. Estoy buscando http://unicode.org/reports/tr35/tr35-10.html#Date_Format_Patterns para obtener instrucciones sobre cómo especificarlo y creo que mi problema está en el formato en sí.configurando el formato de fecha para NSDateFormatter

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ssSSSSSS";  
NSDate* serverDate = [dateFormatter dateFromString:stringFormOfDate];  

¿Ayuda?

+0

¿Falta un punto en el error entre los segundos y los microsegundos? –

+1

¿Cómo sabes que no está bien? Intenta compararlo con el valor en milisegundos. – Sulthan

Respuesta

22

tratar

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSSSSS";  
NSDate* serverDate = [dateFormatter dateFromString:@"2011-04-21 03:31:37.310396"]; 

NSLog(@"%@", serverDate); 

supongo que probablemente olvidado el punto

+6

Si bien esto parece funcionar, tenga en cuenta que la salida 'NSDateFormatter' está limitada a mili-segundos. Cualquier carácter de formato "S" después de 3 producirá "0". Lo mismo aplica para crear una fecha. El intervalo de tiempo para el ejemplo produce: "325063897.310000". Por lo tanto, es posible que esto no responda a la pregunta, ya que se pierden los 396 microsegundos. (probado en OSX, no iPhone) – zaph

+0

totalmente a la derecha, buen punto, solo un problema de copiar y pegar :) – suprandr

5

De acuerdo con el comentario de Zaph en la otra respuesta: el número máximo de S: 3. Las más justo producir ceros.

E.g.

dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSSSSS"; // Last 3 'S' ignored. 

Then @"2011-04-21 03:31:37.311396" will produce 2011-04-21 03:31:37.311000 

para mantener la precisión de microsegundos completa tratar esta magia:

-(NSDate *)_dateFromUtcString:(NSString *)utcString{ 
    if(!utcString){ 
     return nil; 
    } 
    static NSDateFormatter *df = nil; 
    if (df == nil) { 
     df = [[NSDateFormatter alloc] init]; 
     [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
     [df setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
    } 

    NSArray* parts = [utcString componentsSeparatedByString:@"."]; 
    NSDate *utcDate = [df dateFromString:parts[0]]; 
    if(parts.count > 1){ 
     double microseconds = [parts[1] doubleValue]; 
     utcDate = [utcDate dateByAddingTimeInterval:microseconds/1000000]; 
    } 
    return utcDate; 
} 

Ahora un NSString "2011-04-21 03: 31: 37.310396" analizará totalmente a un NSDate 2011-04-21 03 : 31: 37.310396

Cuestiones relacionadas