任何人都知道NSDate的最小和最大可能值是什么?
答案 0 :(得分:42)
答案 1 :(得分:2)
已编辑答案:
我认为我发现最小日期值为0001-01-01 00:00:00 + 0000
(根据我的代码如下),但正如下面的评论中所指出的那样,这只适用于当前时代(即AD)。 NSDate值可能低于此值,但您看到的NSLog结果可能不是您所期望的,所以我建议在这里查看其他答案并忽略我的无知。
原文答案:
我相信我发现最低日期值为0001-01-01 00:00:00 + 0000
在NSLog'ing和解析值时需要非常小心,以确保您的时区不会略微偏移日期值。
我将尝试在下面演示:
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]);
这导致以下输出(在我的iPad上给定其特定时区):
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
注意date2以及如何减去额外的100秒并没有减少日期的值,但实际上似乎增加了它。显然,NSDate的内部工作方式有些特殊,时间调整了100秒,但这可能会因为它不能降低而歪斜日期和月份?
答案 2 :(得分:1)
最大值应为:5828963-12-20 00:00:00 +0000因为
NSDate *dateSinceNow = [NSDate dateWithTimeIntervalSinceNow:DBL_MAX];
NSDate *dateSindeReferenceDate = [NSDate dateWithTimeIntervalSinceReferenceDate:DBL_MAX];
NSLog(@"min: %@, max: %@", dateSinceNow, dateSindeReferenceDate);
是一样的。
最小我得到的是:0001-01-01 00:00:00 +0000
因为这是我在尝试时得到的结果:
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);
但这是davedelong指出的当前时代
所以如果你尝试第一个例子 - DBL_MAX,你得到:41221-07--2147483641 00:00:00 +0000。不知道这是什么时代......