2013-03-01 15 views
17

Qualcuno sa quali sono i valori minimi e massimi possibili per un NSDate?NSDate Min e Max Valori possibili

+0

Spiegare in quale scenario è necessario sapere questo. –

+0

Che bisogno c'è ??? – Melbourne

+1

===> WWDC 2011 Video "Sessione 117 - Esecuzione dei calcoli del calendario" (59:11) –

risposta

1

massima deve essere: 5828963-12-20 00:00:00 +0000 perché

NSDate *dateSinceNow = [NSDate dateWithTimeIntervalSinceNow:DBL_MAX]; 
NSDate *dateSindeReferenceDate = [NSDate dateWithTimeIntervalSinceReferenceDate:DBL_MAX]; 
NSLog(@"min: %@, max: %@", dateSinceNow, dateSindeReferenceDate); 

è lo stesso.

minima ottengo questo è: 0001-01-01 00:00:00 +0000

causa questo è ciò che ottengo quando provo:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; 
[df setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
NSDate *myDate = [df dateFromString: @"0001-01-01 00:00:00"]; 
NSLog(@"%@", myDate); 

ma questa è epoca attuale come punte out da davedelong

quindi se si prova il primo esempio con - DBL_MAX si ottiene: 41221-07--2147483641 00:00:00 +0000. idea di che cosa era questo è ...

+0

Credo che tu abbia riscontrato lo stesso problema che mi ha causato questa domanda. Penso che il valore minimo possibile della data sia 0001-01-01 00:00:00 tuttavia quando si usa NSDateFormatter la data viene distorta dal proprio fuso orario. Riprovare con quanto segue: [df setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT: 0]]. –

+0

timezone dell'impostazione mi dà 0001-01-01 00:00:00 +0000 anche – peko

+3

Questo è solo a metà corretto. Il bit massimo è corretto, ma la tua logica per il minimo è difettosa. Questo è il minimo * per l'era attuale * (CE). 'NSDate' è perfettamente in grado di esprimere le date del BCE. Quello che stai cercando è '[NSDate dateWithTimeIntervalSince1970: -DBL_MAX]' –

2

Risposta A CURA:

ho pensato che avevo scoperto il valore minimo era data 0001-01-01 00:00:00 + 0000 (dato il mio codice qui sotto) Tuttavia, come è stato sottolineato nei commenti sotto, questo è solo per l'era attuale (cioè AD). Un valore NSDate può essere inferiore a questo, ma quello che vedi come risultato di un NSLog potrebbe non essere quello che ti aspetti, quindi consiglierei di guardare altre risposte qui e di ignorare la mia ignoranza.

Risposta ORIGINALE:

credo che ho scoperto il valore minimo data è 0001-01-01 00:00:00 + 0000

È necessario essere molto attenti quando NSLog'ing e valori di analisi al fine di garantire che il vostro isn fuso orario' t distorcendo leggermente il valore della data.

Cercherò di dimostrare qui di seguito:

NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init]; 
[dateFormatter1 setDateFormat:@"yyyy-MM-dd hh:mm:ss z"]; 

NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init]; 
[dateFormatter2 setDateFormat:@"yyyy-MM-dd HH:mm:ss z"]; 

NSDateFormatter *dateFormatter3 = [[NSDateFormatter alloc] init]; 
[dateFormatter3 setDateFormat:@"yyyy-MM-dd HH:mm:ss z"]; 
[dateFormatter3 setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

NSDate *date1 = [NSDate dateWithTimeIntervalSince1970:-62135596800]; 
NSLog(@"date1 = %@", date1); 
NSLog(@"date1 via dateFormatter1 = %@", [dateFormatter1 stringFromDate:date1]); 
NSLog(@"date1 via dateFormatter2 = %@", [dateFormatter2 stringFromDate:date1]); 
NSLog(@"date1 via dateFormatter3 = %@", [dateFormatter3 stringFromDate:date1]); 

NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:-62135596800 - 100]; // The - 100 makes no difference 
NSLog(@"date2 = %@", date2); 
NSLog(@"date2 via dateFormatter1 = %@", [dateFormatter1 stringFromDate:date2]); 
NSLog(@"date2 via dateFormatter2 = %@", [dateFormatter2 stringFromDate:date2]); 
NSLog(@"date2 via dateFormatter3 = %@", [dateFormatter3 stringFromDate:date2]); 

Il risultato è il seguente output (sul mio iPad data la sua particolare fuso orario):

date1 = 0001-01-01 00:00:00 +0000 
date1 via dateFormatter1 = 0001-12-31 11:58:45 GMT-00:01:15 
date1 via dateFormatter2 = 0001-12-31 23:58:45 GMT-00:01:15 
date1 via dateFormatter3 = 0001-01-01 00:00:00 GMT 
date2 = 0001-12-31 23:58:20 +0000 
date2 via dateFormatter1 = 0001-12-31 11:57:05 GMT-00:01:15 
date2 via dateFormatter2 = 0001-12-31 23:57:05 GMT-00:01:15 
date2 via dateFormatter3 = 0001-12-31 23:58:20 GMT 

Nota date2 e come sottraendo ulteriori 100 secondi non ha ridotto il valore della data, ma in realtà sembrava aumentarlo. Ovviamente qualcosa di strano sul funzionamento degli interni di NSDate, il tempo è regolato di 100 secondi, ma questo distorce il giorno e il mese, forse perché non potrebbe andare più in basso?

+1

se provi [NSDate dateWithTimeIntervalSinceNow: - DBL_MAX] ottieni qualcosa come 41221-07--2147483641 00:00:00 +0000 .. – peko

+0

-1 errato. Questa è solo la data minima per l'era attuale, non la data minima complessiva. –

+0

OK grazie per il puntatore, ho aggiornato la mia risposta. Le date mi fanno impazzire e il NSDateFormatter non aiuta davvero le cose. –

40
+1

+1 Apple fornisce questo metodo per questo tipo di domande complicate. – 9dan

+0

Per coloro che, come l'OP, stanno convertendo i valori .Net DateTime e vogliono supportare DateTime.MinValue e DateTime.MaxValue, allora questi metodi Swift potrebbero essere di interesse: http://stackoverflow.com/a/41625877/253938 – RenniePet