2009-08-07 10 views

risposta

4

Se l'oggetto associato alla chiave @ "created_at" è un oggetto NSDate valido, questo codice dovrebbe funzionare.

Tuttavia, suppongo che in realtà sia un NSString. Se è così, produrrà il comportamento che stai descrivendo.

Se ho ragione, il frammento di codice qui sopra assegna un oggetto NSString a un riferimento NSDate. NSDictionary restituisce gli oggetti 'id' non tipizzati, quindi il compilatore non ti darà un avviso di mancata corrispondenza di tipo.

È necessario utilizzare NSDateFormatter per analizzare la stringa in un NSDate (vedere dateFromString :).

-1

Prima di tutto, a cosa serve stringFromDate:? Questo è se hai già un NSDate e vuoi creare una stringa per rappresentarlo.

Inoltre, quando si utilizza il programma di formattazione della data, si fornisce una stringa di formato che non corrisponde alla stringa di data che si sta tentando di interpretare.

Modificare la stringa di formato in modo che corrisponda alle stringhe di data e utilizzare dateFromString: anziché stringFromDate: (con le modifiche di operatore alle dichiarazioni di variabile) e dovrebbe funzionare.

11

Ho avuto la stessa domanda e non ho potuto risolverlo con le risposte sopra citate. ecco cosa ha funzionato per me:

NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease]; 
    //Wed Dec 01 17:08:03 +0000 2010 
    [df setDateFormat:@"eee, dd MMM yyyy HH:mm:ss ZZZZ"]; 
    NSDate *date = [df dateFromString:[[tweets objectAtIndex: storyIndex] objectForKey: TWITTER_CREATED_AT_JSON_KEY]]; 
    [df setDateFormat:@"eee MMM dd yyyy"]; 
    NSString *dateStr = [df stringFromDate:date]; 

dove tweets è un NSMutableArray riempito con NSDictionary oggetti, storyIndex essendo il valore di riga int (in tableView), e TWITTER_CREATED_AT_JSON_KEY essendo una costante NSString con valore created_at. utilizzare dateStr ovunque si desideri visualizzare la data

+1

Grazie @binnyb. Twitter ha modificato il formato ora "Mer, 28 dic 2011 16:48:59 +0000", quindi il primo formato dovrebbe essere: [df setDateFormat: @ "eee, dd MMM y yyy HH: mm: ss ZZZZ "]. – Motasim

+0

grazie ho apportato la modifica – binnyb

+6

Sembra che Twitter abbia cambiato di nuovo il formato, in '@" eee MMM dd HH: mm: ss ZZZZ yyyy "' (o 'Tue Feb 08 15:54:03 +0000 2011') – lxt

3

Sembra simile, Twitter cambia il formato ancora e ancora. Questi lavori per me ora. Non dimenticare di impostare la locale.

NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease]; 
//Mon, 29 Oct 2012 12:24:50 +0000 
[df setDateFormat:@"EEE, dd LLL yyyy HH:mm:ss ZZZ"]; 
[df setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]]; 
NSDate *date = [df dateFromString:[element valueForKey:@"created_at"]]; 
[df setDateFormat:@"yyyy-MM-dd HH:mm"]; 
NSString *dateStr = [df stringFromDate:date]; 

[element valueForKey:@"created_at"] - data da Twitter

0

Sopra niente ha funzionato per me - Prova questo per Twitter: (Ho anche incluso un bel nsdate category per una migliore mostra la data

lbl = (UILabel *)[cell viewWithTag:16]; 
     NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
     //"created_at": "Tue Jul 09 07:45:01 +0000 2013", 
     [df setDateFormat:@"EEE MMM d HH:mm:ss ZZZZ yyyy"]; 
     NSTimeInterval timeIntveral = [[df dateFromString:[[_twitterArray objectAtIndex:indexPath.row] objectForKey:@"created_at"]] timeIntervalSince1970]; 
     NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:timeIntveral]; 

     //will work if you added the nsdate category, linked above 
     NSString *ago = [date timeAgo]; 
     NSLog(@"Output is: \"%@\" %.f", ago,timeIntveral); 
     lbl.text = ago; 

Spero che questo aiuti !

+0

nessun motivo per cui stai usando timeIntervalSince1970? Non puoi semplicemente assegnare il risultato della dataFromString: alla tua variabile data? – Lope

+0

mai provato, ma avrai ragione! – kurtanamo

Problemi correlati