2013-03-01 5 views
17

Кто-нибудь знает, какие минимальные и максимально возможные значения для NSDate?NSDate Min и Max Возможные значения

+0

Пожалуйста, объясните, в каком сценарии вам нужно это знать. –

+0

В чем его потребность ??? – Melbourne

+1

===> WWDC 2011 Video «Session 117 - Выполнение расчётов календаря» (59:11) – 2013-03-01 12:05:05

ответ

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

но это нынешняя эпоха, как заостренный out by davedelong

поэтому, если вы попробуете первый пример с - DBL_MAX, вы получите: 41221-07--2147483641 00:00:00 +0000. понятия не имею, что это эпоха ...

+0

Я считаю, что вы испытываете ту же проблему, которая заставила меня задать этот вопрос. Я думаю, что минимально возможное значение даты 0001-01-01 00:00:00, однако, когда вы используете NSDateFormatter, дата изменяется на ваш часовой пояс. Повторите попытку со следующим: [df setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT: 0]]. –

+0

установка часового пояса дает мне 0001-01-01 00:00:00 +0000 тоже – peko

+3

Это только половина правильной. Максимальный бит правильный, но ваша логика для минимума ошибочна. Это минимальный * для текущей эпохи * (CE). 'NSDate' отлично умеет выражать даты BCE. То, что вы ищете, это '[NSDate dateWithTimeIntervalSince1970: -DBL_MAX]' –

2

EDITED Ответ:

Я думал, что я обнаружил, что минимальное значение даты было 0001-01-01 00:00:00 + 0000 (учитывая мой код ниже), однако, как было указано в комментариях ниже, это только для текущей эры (т.е. AD). Значение NSDate может пойти ниже этого, но то, что вы видите в результате NSLog, возможно, не так, как вы ожидаете, поэтому я бы рекомендовал посмотреть другие ответы здесь и игнорировать мое невежество.

ORIGINAL Ответ:

Я считаю, что я обнаружил, минимальное значение даты является 0001-01-01 00:00:00 + 0000

Вы должны быть очень осторожны, когда NSLog'ing и значения синтаксического анализа, чтобы убедиться, что ваш часовой пояс ISN» t слегка искажает значение даты.

Я попытаюсь продемонстрировать ниже:

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 секунд, но это, в свою очередь, сокращает день и месяц, возможно, потому, что это не может быть ниже?

+1

если вы попробуете [NSDate dateWithTimeIntervalSinceNow: - DBL_MAX], вы получите что-то вроде 41221-07--2147483641 00:00:00 +0000 .. – peko

+0

-1 неверно. Это только минимальная дата текущей эры, а не минимальная дата в целом. –

+0

ОК спасибо за указатель, я обновил свой ответ. Даты дуют мне в голову, и NSDateFormatter действительно не помогает. –

40

Использовать [NSDate distantFuture] и [NSDate distantPast].

+1

+1 Apple предоставляет этот метод для таких сложных вопросов. – 9dan

+0

Для тех, кто, подобно OP, преобразует значения .Net DateTime и хочет поддерживать DateTime.MinValue и DateTime.MaxValue, тогда эти методы Swift могут представлять интерес: http://stackoverflow.com/a/41625877/253938 – RenniePet

Смежные вопросы