23

NSDate の可能な最小値と最大値を知っている人はいますか?

4

4 に答える 4

3

編集された回答:

0001-01-01 00:00:00 + 0000以下のコメントで指摘されているように、日付の最小値が(以下のコードを考えると)発見したと思いましたが、これは現在の時代 (つまりAD)のみです。NSDate の値はこれよりも低くなる可能性がありますが、NSLog の結果として表示されるものは期待どおりではない可能性があるため、ここで他の回答を見て、私の無知を無視することをお勧めします。

元の回答:

日付の最小値が0001-01-01 00:00:00 + 0000

タイムゾーンが日付値をわずかに歪めないように、値を NSLog して解析するときは十分に注意する必要があります。

以下にデモンストレーションを試みます。

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 秒調整されますが、これはおそらくそれ以上下げることができなかったために、日と月をゆがめますか?

于 2013-03-01T14:17:11.640 に答える
2

最大値は次のとおりです: 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 になります。これは何時代のものかわかりません...

于 2013-03-01T12:17:00.357 に答える