Сравните только разницу во времени в объектах Date

#ios #swift #swift3

#iOS #swift #swift3

Вопрос:

У меня есть два Date объекта, и я хочу сравнить только разницу во времени между ними, игнорируя дату. Было бы что-то вроде:

dt1 = (Дата) 2016-09-22 20:05:01 UTC
dt2 = (Дата) 2016-08-20 22:06:00 UTC

и разница между dt1 и dt2 составит 2 часа или 121 минуту.

Есть ли в Swift функция, которую я мог бы сделать?

Ответ №1:

Вы можете использовать Calendar для извлечения DateComponents , а затем объединить день, месяц и год из одного с часом, минутой и секундой другого в другой Date объект. Затем вы можете сравнить два Date объекта, которые имеют одну и ту же дату, используя хорошо документированные методы.

Например, учитывая date1 и date2 , мы можем вычислять date3 с датой date1 , но временем date2 . Затем мы можем сравнить date1 с этим новым date3 :

 let calendar = Calendar.current
let components2 = calendar.dateComponents([.hour, .minute, .second], from: date2)
let date3 = calendar.date(bySettingHour: components2.hour!, minute: components2.minute!, second: components2.second!, of: date1)!
 

Затем, чтобы получить количество минут между date1 и date3 :

 let minutes = calendar.dateComponents([.minute], from: date1, to: date3).minute!
 

Или часы и минуты:

 let difference = calendar.dateComponents([.hour, .minute], from: date1, to: date3)
let hours = difference.hour!
let minutes = difference.minute!
 

Или, если вы хотите показать это пользователю, вы часто используете DateComponentsFormatter для получения хорошего локализованного строкового представления:

 let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.allowedUnits = [.hour, .minute]  // or [.minute]
let string = formatter.string(from: date1, to: date3)!
 

Ответ №2:

Игнорируя дату, вы можете использовать timeIntervalSince(date:), чтобы получить количество секунд между двумя датами.

Ответ №3:

Используйте NSCalenar , затем узнайте час, минуту, а затем найдите разницу между ними.

Ответ №4:

Расширение Swift 3 только для сравнения времени

 import UIKit

extension Date {
    func compareTimeOnly(to: Date) -> ComparisonResult {
    let calendar = Calendar.current
    let components2 = calendar.dateComponents([.hour, .minute, .second], from: to)
    let date3 = calendar.date(bySettingHour: components2.hour!, minute: components2.minute!, second: components2.second!, of: self)!

    let seconds = calendar.dateComponents([.second], from: self, to: date3).second!
    if seconds == 0 {
        return .orderedSame
    } else if seconds > 0 {
        // Ascending means before
        return .orderedAscending
    } else {
        // Descending means after
        return .orderedDescending
    }
    }
}
 

Некоторые тесты

 let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"

let date1 = Date()
var date2 = dateFormatter.date(from: "2016-12-26T12:12:12")!

let result = date1.compareTimeOnly(to: date2)
print(result.rawValue)
 

Ответ №5:

 func findsecond(s_date:String,e_date:String) -> Int {
    //set date formate

    let Dateformatter = DateFormatter()

    Dateformatter.dateFormat = "dd MMM yyyy h:mm a"

    //convert string to date

    let dateold = Dateformatter.date(from: start_date)!
    let datenew = Dateformatter.date(from: end_date)!
    //use default datecomponents with two dates
    let calendar1 = Calendar.current
    let components = calendar1.dateComponents([.second], from: dateold, to: datenew)
    let seconds = components.second
    print("Seconds: (seconds)")
    return seconds!

}