NSDateComponentsFormatter не поддерживается большой интервал
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"
что неправильно.
Я думал, что это может вызвать переполнение, поэтому я пробовал меньшее число и обнаружил, что это странное поведение начинается с интервалом в 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 года является проблемой для вычислений и ситуаций хранения данных, в которых значения времени сохраняются или рассчитываются как 32-разрядное целое число со знаком, и это число интерпретируется как число секунд с 00:00:00 UTC 1 января 1970 года. ("эпоха"). Такие реализации не могут кодировать время после 03:14:07 UTC 19 января 2038 года, проблема, аналогичная, но не полностью аналогичная "проблеме 2000 года" (также известной как "ошибка тысячелетия"), в которой двузначные значения, представляющие количество лет с 1900 года не может кодировать 2000 год или более поздний. Большинство 32-битных Unix-подобных систем хранят и манипулируют временем в этом формате "времени Unix", поэтому проблема 2038 года иногда ассоциируется как "ошибка тысячелетия Unix".
Полный текст статьи: проблема 2038 года