notes files apple app iphone objective-c json datetime

files - Analizando las fechas de JSON en el iPhone



itunes (7)

- (NSString *) convertToUTCTime: (NSString *) strDate {

NSDate *currentDate = [NSDate date]; myDate = [commonDateFormatter dateFromString: strDate]; NSTimeInterval distanceBetweenDates = [currentDate timeIntervalSinceDate:myDate]; return [self stringFromTimeInterval:distanceBetweenDates];

} - (NSString *) stringFromTimeInterval: (NSTimeInterval) interval {NSInteger ti = (NSInteger) interval; NSInteger minutos = (ti / 60)% 60; NSInteger hours = (ti / 3600);

if (hours > 24) { NSInteger days = hours/24; if (days > 30) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"EEE d MMM, h:mm a"]; //[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"IST"]]; NSString *daydate = [dateFormatter stringFromDate:myDate]; return daydate; } else{ return [NSString stringWithFormat:@" %2ldd",(long)days]; } }else{ if (hours == 0 && minutes < 1) { return [NSString stringWithFormat:@"Today"]; } else if (hours == 0 && minutes < 60){ return [NSString stringWithFormat:@"%2ldm ",(long)minutes]; } else{ return [NSString stringWithFormat:@" %2ldh",(long)hours]; } }

}

Perdóname ya que soy nuevo en Objective C.

Estoy recuperando las fechas de un servicio web .NET en el formato / Date (xxxxxxxxxxxxx-xxxx) /. Estoy buscando alguna dirección sobre cómo mejor analizar esto en un objeto NSDate. Intenté usar dateWithTimeIntervalSince1970 en él, pero vuelve con una fecha en el año 1969 para una fecha que sé que es en 2006.

Buscando alguna dirección sobre la forma correcta de manejar las fechas de JSON.

¡Gracias por adelantado!


Acabo de escribir esto para iOS 4.0+ (porque usa NSRegularExpression). Maneja fechas con o sin compensaciones de zona horaria. Parece funcionar bastante bien, ¿qué piensas?

+ (NSDate *)mfDateFromDotNetJSONString:(NSString *)string { static NSRegularExpression *dateRegEx = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ dateRegEx = [[NSRegularExpression alloc] initWithPattern:@"^///date//((-?//d++)(?:([+-])(//d{2})(//d{2}))?//)///$" options:NSRegularExpressionCaseInsensitive error:nil]; }); NSTextCheckingResult *regexResult = [dateRegEx firstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; if (regexResult) { // milliseconds NSTimeInterval seconds = [[string substringWithRange:[regexResult rangeAtIndex:1]] doubleValue] / 1000.0; // timezone offset if ([regexResult rangeAtIndex:2].location != NSNotFound) { NSString *sign = [string substringWithRange:[regexResult rangeAtIndex:2]]; // hours seconds += [[NSString stringWithFormat:@"%@%@", sign, [string substringWithRange:[regexResult rangeAtIndex:3]]] doubleValue] * 60.0 * 60.0; // minutes seconds += [[NSString stringWithFormat:@"%@%@", sign, [string substringWithRange:[regexResult rangeAtIndex:4]]] doubleValue] * 60.0; } return [NSDate dateWithTimeIntervalSince1970:seconds]; } return nil; }


Como programador de .NET aprendiendo Objective-C, tuve el mismo problema cuando traté de consumir un .Net WebService.

Al principio pensé que sería capaz de usar NSDateFormatter ... encontré una referencia muy buena para sus símbolos here , pero rápidamente me di cuenta de que necesitaba convertir el número de milisegundos a segundos.

Escribí el código para hacerlo ... Todavía estoy aprendiendo Obj-C, pero no creo que debería haber sido tan difícil ...

- (NSDate *) getJSONDate{ NSString* header = @"/Date("; uint headerLength = [header length]; NSString* timestampString; NSScanner* scanner = [[NSScanner alloc] initWithString:self]; [scanner setScanLocation:headerLength]; [scanner scanUpToString:@")" intoString:&timestampString]; NSCharacterSet* timezoneDelimiter = [NSCharacterSet characterSetWithCharactersInString:@"+-"]; NSRange rangeOfTimezoneSymbol = [timestampString rangeOfCharacterFromSet:timezoneDelimiter]; [scanner dealloc]; if (rangeOfTimezoneSymbol.length!=0) { scanner = [[NSScanner alloc] initWithString:timestampString]; NSRange rangeOfFirstNumber; rangeOfFirstNumber.location = 0; rangeOfFirstNumber.length = rangeOfTimezoneSymbol.location; NSRange rangeOfSecondNumber; rangeOfSecondNumber.location = rangeOfTimezoneSymbol.location + 1; rangeOfSecondNumber.length = [timestampString length] - rangeOfSecondNumber.location; NSString* firstNumberString = [timestampString substringWithRange:rangeOfFirstNumber]; NSString* secondNumberString = [timestampString substringWithRange:rangeOfSecondNumber]; unsigned long long firstNumber = [firstNumberString longLongValue]; uint secondNumber = [secondNumberString intValue]; NSTimeInterval interval = firstNumber/1000; return [NSDate dateWithTimeIntervalSince1970:interval]; } unsigned long long firstNumber = [timestampString longLongValue]; NSTimeInterval interval = firstNumber/1000; return [NSDate dateWithTimeIntervalSince1970:interval]; }

Con suerte, alguien puede proporcionar una mejor solución de Obj-C. Si no, puedo guardar esto o buscar una forma de cambiar el formato de serialización en .NET

EDITAR:

Acerca de ese formato JSON DateTime ... Si tiene control sobre el servicio, probablemente sería mejor convertir la fecha en una cadena en sus objetos de DataContract.

El formateo de RFC1123 me parece una buena idea en este momento. Como probablemente pueda retomarlo fácilmente usando NSDateFormatter.

Cita de Rick Strahl

No hay una fecha de JavaScript literal y Microsoft diseñó un formato de fecha personalizado que es esencialmente una cadena marcada. El formato es una cadena que está codificada y contiene el nuevo valor estándar de Fecha (milisegundos desde 1970).


De hecho, encontré el fragmento con NSRegularExpression bastante útil, hasta que se me ocurrió otra solución que utiliza NSCharecterSet para detener los milisegundos.

+ (NSDate*) dateFromJSONString:(NSString *)dateString { NSCharacterSet *charactersToRemove = [[ NSCharacterSet decimalDigitCharacterSet ] invertedSet ]; NSString* milliseconds = [dateString stringByTrimmingCharactersInSet:charactersToRemove]; if (milliseconds != nil && ![milliseconds isEqualToString:@"62135596800000"]) { NSTimeInterval seconds = [milliseconds doubleValue] / 1000; return [NSDate dateWithTimeIntervalSince1970:seconds]; } return nil; }

Ahorra una gran cantidad de procesamiento manual de cadenas y hace que el código sea mucho más limpio.


Estaba en el mismo bote mientras usaba json-framework, que no es compatible con el formato de fecha, ya que no es JSON oficial. Mi fuente proviene de una API creada usando JSON.Net. Esto es lo que se me ocurrió:

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

No tengo la porción adjunta en el formato de fecha que usted hace así que no he tratado con eso como la respuesta anterior. No hay errores de captura tampoco, todo es nuevo para mí en este punto.


Teoría: MS codificó el C # DateTime en JSON en milisegundos desde 1970. Solución:

NSString* dateAsString = @"/Date(1353720343336+0000)/"; dateAsString = [dateAsString stringByReplacingOccurrencesOfString:@"/Date(" withString:@""]; dateAsString = [dateAsString stringByReplacingOccurrencesOfString:@"+0000)/" withString:@""]; unsigned long long milliseconds = [dateAsString longLongValue]; NSTimeInterval interval = milliseconds/1000; NSDate* date = [NSDate dateWithTimeIntervalSince1970:interval];

Esta es la solución más corta que puedo pensar.