2013-03-01 20 views
17

NSDate için minimum ve maksimum olası değerlerin ne olduğunu bilen var mı?NSDate Min ve Maksimum Muhtemel Değerler

+0

Lütfen bunu bilmeniz gereken senaryoda açıklayınız. –

+0

Bunun için ne gerekiyor ??? – Melbourne

+1

===> WWDC 2011 Video "Oturum 117 - Takvim Hesaplamaları Gerçekleştirme" (59:11) –

cevap

1

maksimum olmalıdır: 5828963-12-20 00:00:00 +0000

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

çünkü aynıdır. i çalıştığınızda bu 0001-01-01 00:00:00 +0000

nedeni i elde ediyoruz: i bu olsun

minimum

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

ama bu sivri gibi güncel dönemdir

tarafından dışarı çıkıldığında, ilk örneği - DBL_MAX ile denerseniz, 41221-07--2147483641 00:00:00 +0000 elde edersiniz. Bunun ne çağ hiçbir fikri ...

+0

Bu soruyu sormamı sağlayan aynı sorunu yaşadığınızı düşünüyorum. En düşük tarih değerinin 0001-01-01 00:00:00 olduğunu düşünüyorum, ancak NSDateFormatter'ı kullandığınızda tarihiniz saat diliminiz tarafından çarpıtılıyor. Aşağıdaki ile tekrar deneyin: [df setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT: 0]]. –

+0

ayar zaman dilimi bana 0001-01-01 00:00:00 +0000 verir – peko

+3

Bu sadece yarı doğrudur. Maksimum bit doğrudur, ancak minimum için mantığınız hatalı. Mevcut dönem * için bu en düşük * (CE). NSDate, BCE tarihlerini mükemmel bir şekilde ifade edebiliyor. Ne aradığınız '' NSDate dateWithTimeIntervalSince1970: -DBL_MAX] ' –

2

DÜZENLENECEK Cevap:

ben Açıklamalarda belirttiği edildiği gibi asgari tarih değeri (aşağıda benim kod verilmiş) ANCAK 0001-01-01 00:00:00 + 0000 oldu bulduklarını düşündüm Aşağıda, bu sadece akım dönemi (örn. AD) içindir. Bir NSDate değeri bundan daha düşük olabilir, ancak bir NSLog sonucunda gördüğünüz şey beklediğiniz şey olmayabilir, bu yüzden burada diğer cevaplara bakmanızı ve cehaletimi görmezden gelmenizi tavsiye ederim.

ORİJİNAL Cevap:

Ben asgari tarih değerini fark ettik inanıyoruz NSLog'ing ve ayrıştırma değerleri sağlamak için çok dikkatli olmak gerekir 0001-01-01 00:00:00 + 0000

olduğunu saat dilimi değil mi' t Tarih değerini hafifçe değiştirerek. Ek bir 100 saniye çıkarılarak

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 

Not DATE2 ve nasıl:

denemek ve aşağıda gösterecektir:

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

Bu (kendi özel zaman dilimi verilen my iPad) Aşağıdaki çıktıda sonuçlar tarihin değerini azaltmadı, ancak aslında onu arttırmış görünüyordu. Açıkçası NSDate'in iç çalışmalarının kendine özgü bir özelliği var, zaman 100 saniyeye göre ayarlanıyor, ama bu belki de gündüz ve ayı çarpıyor belki de daha düşük olamazdı.

+1

Eğer [NSDate dateWithTimeIntervalSinceNow: - DBL_MAX] 41221-07--2147483641 00:00:00 +0000 .. – peko

+0

-1 yanlış bir şey olsun. Bu, mevcut dönem için sadece minimum tarih değil, genel minimum tarih değildir. –

+0

İşaretçi için teşekkürler, cevabımı güncelledim. Tarihler aklımı ve NSDateFormatter gerçekten önemli değil yardımcı olur. –

40
+1

+1 Apple, bu tür zor sorular için bu yöntemi sunar. – 9dan

+0

OP gibi, .Net DateTime değerlerini dönüştüren ve DateTime.MinValue ve DateTime.MaxValue öğesini desteklemek isteyenler için, bu Swift yöntemleri ilgi çekici olabilir: http://stackoverflow.com/a/41625877/253938 – RenniePet