如何快速计算两个日期之间的时间(分钟)?

时间:2019-06-23 00:36:47

标签: ios swift date time

我们得到了什么:日期和时间(格式yyyy-mm-dd hh:mm a)

我们在寻找什么:时差(以分钟为单位)

什么操作:NewDate-OldDate

所以,我想知道如何才能实现上述目标?我想将日期和时间格式化为美国,而不管用户使用哪种语言环境。我该怎么办?

然后我将'oldTime'保存到UserDefaults中,并用于以后的计算。目标是使用户延迟5分钟,然后进行计算以确定用户是否应该延迟。

3 个答案:

答案 0 :(得分:1)

只需创建一个需要两个日期并像这样比较它们的函数即可。

import UIKit


func minutesBetweenDates(_ oldDate: Date, _ newDate: Date) -> CGFloat {

    //get both times sinces refrenced date and divide by 60 to get minutes
    let newDateMinutes = newDate.timeIntervalSinceReferenceDate/60
    let oldDateMinutes = oldDate.timeIntervalSinceReferenceDate/60

    //then return the difference
    return CGFloat(newDateMinutes - oldDateMinutes)
}


//Usage:

let myDateFormatter = DateFormatter()
myDateFormatter.dateFormat = "yyyy-MM-dd HH:mm"

//You'll need both dates to compare, you can get them by just storing a Date object when you first start the timer.
//Then when you need to check it, compare it to Date()
let oldDate: Date = myDateFormatter.date(from: String("2019-06-22 11:25"))

func validateRefresh() {

    //do the comparison between the old date and the now date like this.
    if minutesBetweenDates(oldDate, Date()) > 5 {
        //Do whatever
    }
}

答案 1 :(得分:1)

您说:

  

无论用户使用哪种语言环境,我都希望将日期和时间格式化为美国。我该怎么办?

指定Locale中的en_US_POSIX

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd hh:mm a"
formatter.locale = Locale(identifier: "en_US_POSIX")

语言环境不是唯一的问题。

  • 还有一个时区问题。例如,您要离开芝加哥,从中部到东部时区。您真的要考虑已经过去了一个小时吗?

  • 您真的要舍弃秒吗?如果您这样做,从8:00:00 pm到8:00:59 pm之间的59秒将被视为“零分钟”,但在8:00:59 pm和8:01:00 pm之间的一秒将被视为“一分钟”分钟”。

坦率地说,如果我要保存区域设置和时区不变的日期字符串,建议使用ISO8601DateFormatter

  

然后我将'oldTime'保存到UserDefaults中,并用于以后的计算。

如果这就是您使用此DateFormatter的原因,建议您直接保存Date对象。

UserDefaults.standard.set(oldTime, forKey: "oldTime")

并进行检索:

if let oldTime = UserDefaults.standard.object(forKey: "oldTime") as? Date {
    ...
}

根据计算两个Date对象之间的分钟数

let minutes = Calendar.current
    .dateComponents([.minute], from: date1, to: date2)
    .minute

如果需要秒数,也可以使用timeIntervalSince

let seconds = date2.timeIntervalSince(date1)

如果您想将经过的时间显示为一个不错的本地化字符串:

let intervalFormatter = DateComponentsFormatter()
intervalFormatter.allowedUnits = [.minute, .second]
intervalFormatter.unitsStyle = .full
let string = intervalFormatter.string(from: date1, to: date2)

答案 2 :(得分:0)

我不相信您的问题是实现目标的最佳方法,但是下面的代码可以工作。

let dateFormatterNow = DateFormatter()
dateFormatterNow.dateFormat = "yyyy-MM-dd hh:mm a"
dateFormatterNow.timeZone = TimeZone(abbreviation: "EST")

let oldDateString = "2019-06-23 12:44 p"
let oldDate = dateFormatterNow.date(from: oldDateString)

let newDateString = "2019-06-23 12:54 p"
let newDate = dateFormatterNow.date(from: newDateString)

if let oldDate = oldDate, let newDate = newDate {
    let diffInMins = Calendar.current.dateComponents([.minute], from: oldDate, to: newDate).minute
    print(diffInMins)
}
相关问题