2013-03-01 10 views
17

Ktoś wie, jakie są minimalne i maksymalne możliwe wartości dla NSDate?NSDate Min i Max Możliwe wartości

+0

Proszę wyjaśnić, w jakim scenariuszu trzeba to wiedzieć. –

+0

Jaka jest tego potrzeba? – Melbourne

+1

===> Wideo WWDC 2011 "Sesja 117 - Wykonywanie obliczeń kalendarza" (59:11) –

Odpowiedz

1

maksymalna powinna być: 5828963-12-20 00:00:00 +0000 ponieważ

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

jest taka sama.

minimum dostaję to: 0001-01-01 00:00:00 +0000

przyczyną jest to, co otrzymuję podczas próby:

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); 

ale jest obecna era jak wskazano przez davedelong

, więc jeśli spróbujesz pierwszy przykład z - DBL_MAX otrzymasz: 41221-07--2147483641 00:00:00 +0000. nie wiem co to jest era ...

+0

Wierzę, że doświadczasz tego samego problemu, który spowodował, że zadałem to pytanie. Myślę, że minimalna możliwa wartość daty to 0001-01-01 00:00:00, jednak kiedy używasz NSDateFormatter data jest wypaczana przez twoją strefę czasową. Spróbuj ponownie, wykonując następujące czynności: [df setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT: 0]]. –

+0

ustawienie timezone daje mi 0001-01-01 00:00:00 +0000 też – peko

+3

To jest tylko połowa poprawna. Bit maksymalny jest poprawny, ale twoja logika minimalna jest wadliwa. To minimum * dla obecnej ery * (CE). 'NSDate' jest całkowicie zdolny do wyrażania dat BCE. To, czego szukasz, to '[NSDate dateWithTimeIntervalSince1970: -DBL_MAX]' –

2

EDITED Odpowiedź:

Myślałem, że ja odkryłem wartość minimalna data była 0001-01-01 00:00:00 + 0000 (biorąc pod uwagę mój kod poniżej) Jednakże jak zostało wskazane w komentarzach poniżej, jest to tylko dla bieżącej ery (tj. AD). Wartość NSDate może być niższa niż ta, ale to, co widzisz w wyniku NSLog, może nie być tym, czego się spodziewasz, więc poleciłabym przejrzenie innych odpowiedzi tutaj i ignorowanie mojej niewiedzy.

ORIGINAL Odpowiedź:

wierzę, że odkryłem minimalną wartość daty jest 0001-01-01 00:00:00 + 0000

Trzeba być bardzo ostrożnym przy NSLog'ing i wartości parsowanie aby upewnić się, że ISN stref czasowych” t nieznacznie przekrzywiając wartość daty.

Postaram się wykazać poniżej:

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]); 

Wynika to w następnym wyjściu (na moim iPadzie biorąc pod uwagę jego szczególności stref czasowych):

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 

Uwaga date2 i jak odejmując dodatkowe 100 sekund nie zmniejszyło wartości daty, ale wydawało się, że ją zwiększyło. Oczywiście, coś dziwnego w sposobie działania wewnętrznych NSDate, czas jest regulowany o 100 sekund, ale to pochyla dzień i miesiąc, może dlatego, że nie może iść niżej?

+1

jeśli spróbujesz [NSDate dateWithTimeIntervalSinceNow: - DBL_MAX] otrzymasz coś takiego jak 41221-07--2147483641 00:00:00 +0000 .. – peko

+0

-1 niepoprawne. Jest to tylko minimalna data bieżącej epoki, a nie minimalna ogólna data. –

+0

OK dzięki za wskaźnik, zaktualizowałem swoją odpowiedź. Daty mnie dmuchają, a NSDateFormatter naprawdę nie pomaga. –

40
+1

+1 Apple zapewnia tę metodę dla tego rodzaju podchwytliwych pytań. – 9dan

+0

Dla tych, którzy, podobnie jak OP, konwertują wartości .Net DateTime i chcą wspierać DateTime.MinValue i DateTime.MaxValue, wtedy te metody Swift mogą być interesujące: http://stackoverflow.com/a/41625877/253938 – RenniePet

Powiązane problemy