Расчет даты возвращает неправильные значения - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь вычислить разницу в секундах между двумя датами. Приведенный ниже код возвращает неправильные значения (по сравнению с существующим скриптом perl вручную и с использованием Интернета). Я следовал за многими предложениями, размещенными на этом форуме, но возвращенные результаты не верны. Пожалуйста, сообщите.

Площадка выглядит следующим образом:

import UIKit

var str = "Hello, playground"

let startMon = 05
let startMday = 26
let startYear = 2016
let startDateStr = "\(startYear)/\(startMon)/\(startMday)"
var difference = 0.0
let secondsPerYear = 31536000.00 //3.154e+7
let secondsPerDay = 86400.0

let dateFormatter = DateFormatter()
//let currentDate = Date().timeIntervalSince1970
let currentDate = Date()
let timeIntervalNow = currentDate.timeIntervalSince1970
dateFormatter.dateFormat = "yyyy/mm/dd"
let startDateFormatted = dateFormatter.date(from: startDateStr)
let startDateInterval = startDateFormatted?.timeIntervalSince1970
difference = timeIntervalNow - startDateInterval!
print("difference == \(difference)")
let years = difference/secondsPerYear
print("Years == \(years)")
//let difference = startDateFormatted?.timeIntervalSince(currentDate)
difference = currentDate.timeIntervalSince(startDateFormatted!)
print("difference == \(difference)")
let years_1 = difference/secondsPerYear
print("Years == \(years_1)")

let days = difference/secondsPerDay
print("days == \(days)")
/*
difference == 126336349.94199085
Years == 4.006099376648619
difference == 126336349.94199097
Years == 4.006099376648623
days == 1462.234392008496

Calculated On the web:

 3 years, 8 months, 2 days including the end date.
 115,948,800 seconds
 1,341 days
 */

1 Ответ

2 голосов
/ 27 января 2020

Основной ошибкой является формат даты: mm - минуты, MM - месяцы.

Тем не менее Calendar может вычислить разницу дат гораздо надежнее, чем ужасная 86400 математика

let startMon = 05
let startMday = 26
let startYear = 2016
let startDateStr = "\(startYear)/\(startMon)/\(startMday)"

let dateFormatter = DateFormatter()
let currentDate = Date()
dateFormatter.locale = Locale(identifier : "en_US_POSIX")
dateFormatter.dateFormat = "yyyy/MM/dd"
let startDateFormatted = dateFormatter.date(from: startDateStr)

let difference = Calendar.current.dateComponents([.year, .month, .day], from: startDateFormatted!, to: Date())
print(difference)

Или с DateComponents

let startMon = 05
let startMday = 26
let startYear = 2016
let startComponents = DateComponents(year: startYear, month: startMon, day: startMday)
let nowComponents = Calendar.current.dateComponents([.year, .month, .day], from: Date())

let difference = Calendar.current.dateComponents([.year, .month, .day], from: startComponents, to: nowComponents)
print(difference)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...