2011-04-27 13 views
6

Estoy trabajando con una API que devuelve un objeto .NET DateTime en mi aplicación iOS. Estoy un poco confundido en lo que está pasando, el DateTime se ve bien cuando sale de la API, pero cuando se trata de que pasa a través de JSON y viene en forma de cadena que tiene este aspecto:Formateo de un objeto DateTime de .NET en un NSDate para objetivo-c

/Date(1303884000000-0600)/ 

WTF es eso y ¿cómo puedo convertirlo en un objeto NSDate?

Gracias!

Respuesta

11

De Parsing JSON dates on IPhone me encontré con la siguiente función sea perfecto:

- (NSDate*) getDateFromJSON:(NSString *)dateString 
{ 
// Expect date in this format "/Date(1268123281843)/" 
int startPos = [dateString rangeOfString:@"("].location+1; 
int endPos = [dateString rangeOfString:@")"].location; 
NSRange range = NSMakeRange(startPos,endPos-startPos); 
unsigned long long milliseconds = [[dateString substringWithRange:range] longLongValue]; 
NSLog(@"%llu",milliseconds); 
NSTimeInterval interval = milliseconds/1000; 
return [NSDate dateWithTimeIntervalSince1970:interval]; 
} 
+0

Tenga en cuenta que esto no maneja un desplazamiento de zona horaria. –

2

Esencialmente lo que obtienes es milisegundos desde el 1 de enero de 1970 UTC, con el -0600 como el desplazamiento de la zona horaria. Eche un vistazo a esta entrada de blog http://weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx

Probablemente tenga que escribir un NSDateFormatter personalizado para manejar una fecha en ese formato, o puede formatearlo en .NET (más fácil), generar una cadena en JSON, y luego usar un NSDateFormatter estándar.

+0

No puedo entender por qué hay 3 ceros adicionales al final de la cadena sin embargo. Usando el convertidor de tiempo de Unix con "1303884000000" obtengo la fecha incorrecta. Si me deshago de los 3 ceros y los convierto con "1303884000", obtengo la fecha correcta. ¿Cuáles son esos ceros adicionales para (o de)? – Buchannon

+0

Oh, supongo que es milisegundos desde 1970 en lugar de solo segundos. Entonces, para analizar esto como un NSDate, tendría que quitar todos los personajes y luego comparar el tiempo desde 1970? – Buchannon

+0

Puedes hacerlo de esa manera. A continuación, puede agregar/restar horas para ajustar la zona horaria si es necesario. Como dije anteriormente, es posible que desee hacer un poco más de formato en el lado de .NET, ya que es probablemente más fácil de esa manera :) – psy

Cuestiones relacionadas