Objective c NSDate最小和最大可能值

Objective c NSDate最小和最大可能值,objective-c,cocoa,nsdate,Objective C,Cocoa,Nsdate,有人知道NSDate的最小值和最大值吗?最大值应该是:5828963-12-20 00:00:00+0000,因为 NSDate *dateSinceNow = [NSDate dateWithTimeIntervalSinceNow:DBL_MAX]; NSDate *dateSindeReferenceDate = [NSDate dateWithTimeIntervalSinceReferenceDate:DBL_MAX]; NSLog(@"min: %@, max: %@", dateS

有人知道NSDate的最小值和最大值吗?

最大值应该是: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);
但正如达维德隆所指出的,这是当今时代


因此,如果您使用-DBL_MAX尝试第一个示例,您将得到:41221-07--2147483641 00:00:00+0000。不知道现在是什么时代…

编辑答案:

我原以为我已经发现最小日期值是
0001-01-01 00:00:00+0000
(鉴于我下面的代码),但正如下面的评论所指出的,这仅适用于当前时代(即公元前)。NSDate值可能会低于此值,但您看到的NSLog结果可能不是您所期望的,因此我建议您在此处查看其他答案,忽略我的无知

原始答案:

我相信我已经发现最小日期值是
0001-01-01 00:00:00+0000

在记录和解析值时需要非常小心,以确保您的时区不会稍微偏离日期值

我将尝试并演示以下内容:

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上,考虑到其特定的时区):


请注意date2以及减去额外的100秒并没有减少日期的值,但实际上似乎增加了日期的值。很明显,NSDate内部的工作方式有些奇怪,时间调整了100秒,但这会使日和月发生偏差,可能是因为它不能再降低了?

请使用和。

请解释在什么情况下你需要知道这一点。需要它做什么???==>WWDC 2011视频“会话117-执行日历计算”(59:11)我从JSON.NET服务接收基于历元的日期/时间值,并使用[NSDate date WITH TIMEINTERVALICENCES1970:]将这些值转换为NSDate。在打印0001-01-01的值(.NET DateTime.MinValue)时,我看到一个不寻常的输出;它错误地打印为0001年12月31日,我想知道这是否与NSDate的最小限制有关。但是,经过进一步挖掘,我发现问题出在NSDateFormatter上。不过,我仍然很好奇最大值和最小值是什么,除了它的基本类型之外,可能没有任何可行的界限(双重?。@Hagglead您的直觉是正确的。边界由基础类型定义。至于“0001-01-01”“有点。。。当你谈论几百年前的日期时,没有日历是可靠的,主要是因为人类的记录是不可靠的。至于为什么打印为12月31日,请确保您正确设置了时区。“公元0001年12月31日”实际上可能指的是公元前1年(例如)北美,当时格林尼治标准时间已经是公元1月1日。我相信你遇到的问题与我提出这个问题的原因相同。我认为最小可能的日期值是0001-01-01 00:00:00,但是当您使用NSDateFormatter时,日期会因时区而发生偏移。请使用以下命令重试:[df setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]。设置时区只会给我0001-01-01 00:00:00+0000个齿,这是正确的一半。最大值位是正确的,但最小值的逻辑有缺陷。这是当前时代(CE)的最低要求
NSDate
完全能够表示BCE日期。你要找的是
[NSDate date WITH TIME INTERVALICENS1970:-DBL_MAX]
@DaveDeLong是41221-07--2147483641 00:00:00+0000 bce日期?还是说我必须要经历一个时代或其他什么?佩科,在我看来是这样的。您可以通过
-比较:
-将该日期与
0001-01-01
日期进行比较来确认这一点。如果尝试[NSDate date WITH TIMEINEVERSICENCENOW:-DBL_MAX]您会得到类似于41221-07--2147483641 00:00:00+0000的结果-1不正确。这只是当前纪元的最小日期,而不是总的最小日期。好的,谢谢你的提示,我已经更新了我的答案。日期让我大吃一惊,NSDateFormatter真的帮不上忙。+1 Apple为此类棘手的问题提供了这些方法。对于那些像OP一样正在转换.Net DateTime值,并且希望支持DateTime.MinValue和DateTime.MaxValue的人来说,这些快速方法可能会引起兴趣:
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