Расчет времени и продолжительность - PullRequest
0 голосов
/ 05 мая 2018
func timeDuration() {
        let currentTimeStr = myTime()
        let oldTimeStr = UserDefaults.standard.string(forKey: "myTime")

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "H:mm:ss"

        let dateComponentFormatter = DateComponentsFormatter()
        dateComponentFormatter.allowedUnits = [.hour, .minute]
        dateComponentFormatter.unitsStyle = .short

        if let currentTime = dateFormatter.date(from: currentTimeStr),
            let oldTime = dateFormatter.date(from: oldTimeStr!),
            let durationStr = dateComponentFormatter.string(from: oldTime, to: currentTime)
        {
            print(durationStr) // 2 hrs
            lblDuration.stringValue = durationStr + " Ago"            }

    }

func myTime()  -> String {
    let date = Date()
    let calendar = Calendar.current
    let hour = calendar.component(.hour, from: date)
    let minutes = calendar.component(.minute, from: date)
    let seconds = calendar.component(.second, from: date)



    return "\(hour):\(minutes):\(seconds)"
}

Я использую обе функции в своем приложении, в основном мое приложение отслеживает последний раз, когда я принимал дозу лекарства. Он также вызывает функцию timeDuration, чтобы я мог отобразить количество часов и минут, которое было с момента последней дозы. В 12:00 у него есть ошибка, он сначала показывает время как 0,00.00, так что кое-как он портит продолжительность. Я предоставил снимок экрана с этим. Также я попытался добавить оператор if, чтобы сделать if hour == 0, а затем изменить часы на 24, и он отображает время как 24:00:00, но все равно влияет на мой код продолжительности. Может кто-нибудь помочь. enter image description here

enter image description here

Вы можете скачать исходный код моего проекта по ссылке ниже. Исходный код проекта

1 Ответ

0 голосов
/ 05 мая 2018

Вы можете сохранить время как TimeInterval, которое хранится как Double:

    let timeOfDose = Date().timeIntervalSince1970
    UserDefaults.standard.set(timeOfDose, forKey: "LastDose")

Реализовать функцию для преобразования TimeInterval в String

    func stringFromTimeInterval(timeInterval: TimeInterval) -> NSString {

        let timeIntervalInt = Int(timeInterval)

        let hours = (timeIntervalInt / 3600)
        let minutes = (timeIntervalInt / 60) % 60
        let seconds = timeIntervalInt % 60

        return NSString(format: "%0.2d:%0.2d:%0.2d",hours,minutes,seconds)
    }

Затем вы можете реализовать следующее:

    //Get current date/time as TimeInterval (Double)
    let currentTimeInterval = Date().timeIntervalSince1970

    //Get date/time of last dose as TimeInterval (Double)
    let lastDoseTimeInterval = UserDefaults.standard.double(forKey: "LastDose")

    //Get the difference
    let durationTimeInterval = currentTimeInterval - lastDoseTimeInterval

    //convert lastDoseTimeInterval to Date Object
    let lastDoseDate = Date(timeIntervalSince1970: lastDoseTimeInterval)

    //Initialise Date Formatter
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH:mm"

    //Create your output Strings
    let currentTimeString = dateFormatter.string(from: Date()) //eg 19:40
    let lastDoseString = dateFormatter.string(from: lastDoseDate) //eg 19:32
    let durationString = stringFromTimeInterval(timeInterval: durationTimeInterval) //eg 00:07:47
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...