2016-07-18 2 views
0
let date = NSDate() 
let future = NSDate.distantFuture() 

let f = NSDateComponentsFormatter() 
f.unitsStyle = .Full 
f.allowedUnits = [.Year, .Month, .Day] 

f.stringFromTimeInterval(future.timeIntervalSinceDate(date)) 

Результат "-57 years, 0 months, 26 days", который является неправильным.NSDateComponentsFormatter не поддерживается большой интервал

Я думал, что это может вызвать от переполнения, поэтому я стараюсь меньшее число и обнаружили, что это странное поведение начинается в 69 лет интервальных

let date = NSDate() 

let sixtyEightYears = NSCalendar.currentCalendar().dateByAddingUnit(.Year, value: 68, toDate: date, options: NSCalendarOptions())! 
let sixtyNineYears = NSCalendar.currentCalendar().dateByAddingUnit(.Year, value: 69, toDate: date, options: NSCalendarOptions())! 

let f = NSDateComponentsFormatter() 
f.unitsStyle = .Full 
f.allowedUnits = [.Year, .Month, .Day] 

future.timeIntervalSinceDate(date) 

sixtyEightYears.timeIntervalSinceDate(date) // 2145916800 
sixtyNineYears.timeIntervalSinceDate(date) // 2177452800 

f.stringFromTimeInterval(sixtyNineYears.timeIntervalSinceDate(date)) // "-67 years, 1 month, 6 days" 

Является ли это ошибка Apple, или я сделал что-то не так?

ответ

1

Метод timeIntervalSinceDate, ссылочная дата которого 1 января 1970 г. вызывает проблему.

1970 + 68 = 2038

Материал из Википедии:

год 2038 проблема

Год 2038 проблема является проблемой для вычислений и хранения данных ситуаций, в которых значения времени хранится или вычисляется как подписанное 322-битное целое число , и это число интерпретируется как число секунд с 00:00:00 по UTC 1 января 1970 года («эпоха ч "). Такие реализации не могут кодировать времена после 03:14:07 UTC 19 января 2038 проблема, аналогичная, но не совсем аналогичная проблеме «Y2K » (также известная как «Ошибка тысячелетия»), в которой двузначный значения , представляющие количество лет с 1900 года, не могут кодировать год 2000 или новее. Большинство 32-битных Unix-подобных систем хранят и обрабатывают время в этом формате «Unix time», поэтому проблема 2038 года иногда бывает , называемая «Unix Millennium Bug» по ассоциации.

Полный текст статьи: Year 2038 problem

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