2013-01-15 4 views

risposta

11

Per prima cosa memorizzare i dati in NSString. E quindi convertire la stringa in NSDate.

È possibile fare riferimento SO:

Converting NSString to NSDate (and back again)

NSString to NSDate conversion problem

How to convert NSString to NSDate using NSDateFormatter?

+1

Questo non ha senso. L'OP sta chiedendo come ** codificare ** un NSDate. Ciò significa che devono convertire NSDate in un NSString prima di inserirlo nel dizionario che stanno tentando di codificare JSON. La mia risposta qui sotto mostra una soluzione di esempio. – sumizome

+0

non è una buona soluzione. è solo un by-pass. Devo sapere come farlo funzionare con NSDate stesso o, in caso contrario, perché questo sta accadendo. – Nishant

7

Convert NSDate a NSString e cercare di codificare.

- (NSString *) changeDateToDateString :(NSDate *) date { 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; 
    NSLocale *locale = [NSLocale currentLocale]; 
    NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"hh mm" options:0 locale:locale]; 
    [dateFormatter setDateFormat:dateFormat]; 
    [dateFormatter setLocale:locale]; 
    NSString *dateString = [dateFormatter stringFromDate:date]; 
    return dateString; 
} 
0

È necessario convertire la data in una stringa prima di provare a codificarla. Ci sono abbastanza esempi ovunque, quindi dovrebbe essere facile da trovare

4

Hai provato?

updateDate = [NSNumber numberWithFloat:[[NSDate date] timeIntervalSince1970]]; 

come descritto di seguito: SDK not supporting NSDate objects

Seguire questi Passi:

1. convertire la data in JSON Formato:

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init]autorelease]; 
[formatter setDateFormat:@"Z"]; 
NSString *updateDate = [NSString stringWithFormat:@"/Date(%.0f000%@)/", [[NSDate date] timeIntervalSince1970],[formatter stringFromDate:[NSDate date]]]; 

2. Incorpora in alcuni array e POST l'array.

+3

Perché mai useresti il ​​float? float ha precisioni a 24 bit. Ci sono oltre un miliardo di secondi dal 1970. Il che significa che la tua risoluzione è peggio di un minuto. Il tuo formato della data è assolutamente non standard. – gnasher729

4

Come indicato, è necessario prima convertire il NSDate in NSString. Tuttavia, non è immediatamente chiaro quale formato debba essere rappresentato nella data. La risposta può essere trovata here: "JSON stesso non specifica come devono essere rappresentate le date, ma Javascript lo fa" - ISO8601.

Ecco un metodo di conversione ISO8601 da una categoria di supporto per NSDate, cortesia Erica Sadun:

- (NSString *)ISO8601 { 
    struct tm time; 
    time_t interval = [self timeIntervalSince1970]; 
    gmtime_r(&interval, &time); 
    char *x = calloc(1, 21); 
    strftime_l(x, 20, "%FT%TZ", &time, gmtlocale); 
    NSString *string = [NSString stringWithUTF8String:x]; 
    free(x); 
    return string; 
} 

Se si ottiene una stringa ISO8601 nuovo in un carico utile JSON e volete convertirlo in un NSDate, utilizzare questa classe metodo per NSDate:

+ (NSDate *)dateFromISO8601:(NSString *)string { 
    if(!string) return nil; 
    if (![string isKindOfClass:[NSString class]]) return nil; 
    struct tm time; 
    strptime_l([string UTF8String], "%FT%TZ", &time, gmtlocale); 
    return [NSDate dateWithTimeIntervalSince1970:timegm(&time)]; 
} 
2

il modo più semplice per memorizzare e recuperare un oggetto NSDate in JSON sarebbe quella di utilizzare la proprietà timeIntervalSince1970 di NSDate.

La restituito NSTimeInterval (doppio) è abbastanza standard e può essere facilmente riconvertito in un oggetto NSDate utilizzando:

NSDate dateWithTimeIntervalSince1970:<#(NSTimeInterval)#> 
0

Per il nostro caso, stiamo usando Mantle per convertire un oggetto JSON e uno dei nostri oggetti con immobili NSDate manca la sua JSONTransformer

@property (nonatomic) NSDate *expiryDate; 

dove:

+ (NSValueTransformer *)expiryDateJSONTransformer { 
    return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *dateString, BOOL *success, NSError *__autoreleasing *error) { 
     return [self.dateFormatter dateFromString:dateString]; 
    } reverseBlock:^id(NSDate *date, BOOL *success, NSError *__autoreleasing *error) { 
     return [self.dateFormatter stringFromDate:date]; 
    }]; 
} 

+ (NSDateFormatter *)dateFormatter { 
    NSDateFormatter *df = [NSDateFormatter new]; 
    df.dateFormat = @"yyyy-MM-dd"; 
    return df; 
}