2017-02-13 10 views
1

По какой-то причине, когда я использую Date() (чтобы получить текущую дату), а затем вычислить разницу во времени, это всегда 1 минута. Однако, когда я жестко кодирую дату и вычисляю разницу во времени, это правильно.Почему разница между двумя датами на 1 минуту, если используется Date()?

Почему это и как я могу точно рассчитать разницу между датой прямо сейчас (то есть currentDate) и датой в будущем (т. Е. date2)?

Чтобы показать вам, что я имею в виду вот пример площадка: enter image description here

Код

let calendar = Calendar.current 
var components = DateComponents() 
components.day = 12 
components.month = 2 
components.year = 2017 
components.hour = 19 
components.minute = 50 

let date1 = calendar.date(from: components) 

components.hour = 20 
components.minute = 30 

let date2 = calendar.date(from: components) 

let currentDate = Date() 

let conversionInfoAccurate = Calendar.current.dateComponents([.hour, .minute, .day], from: date1!, to: date2!) 
let daysAccurate = conversionInfoAccurate.day 
let hoursAccurate = conversionInfoAccurate.hour 
let minutesAccurate = conversionInfoAccurate.minute 

let conversionInfo1Off = Calendar.current.dateComponents([.hour, .minute, .day], from: currentDate, to: date2!) 
let days1Off = conversionInfo1Off.day 
let hours1Off = conversionInfo1Off.hour 
let minutes1Off = conversionInfo1Off.minute 
+3

потому что второй отличается? –

+0

Имеет ли 'currentDate' компонент секунд? –

+0

Все даты имеют второй компонент. Или, скорее, дата не имеет компонентов; декомпозиция - это функция календаря. –

ответ

3

Date s имеют точность до уровня миллисекунд. Если вам не повезло, результатом Date() является некоторое количество миллисекунд (или даже целых секунд) после дата, которую вы создали из компонентов. assert(date1 != currentDate)

Затем, когда вы просите разницы, есть 39 целые минут, и некоторое количество секунд, от currentDate. Дата, которую вы построили, падает ровно на минуту, и между ней и рядом есть 40 минут.