繁体   English   中英

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

[英]How to calculate time (minutes) between two dates in swift?

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

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

什么操作:NewDate - OldDate

所以,我想知道我如何才能实现上述目标? 我想将日期和时间格式化为美国,无论用户使用哪种语言环境。 我怎样才能做到这一点?

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

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

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
    }
}

当然,您可以将日期格式化程序上的.dateFormat值更改为您喜欢的任何格式。 一个寻找正确格式的好网站是: https : //nsdateformatter.com/

你说:

我想将日期和时间格式化为美国,无论用户使用哪种语言环境。 我怎样才能做到这一点?

指定en_US_POSIXLocale

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

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

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

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

坦率地说,如果我想保存区域设置和时区不变的日期字符串,我建议使用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)

我不相信您的问题是实现目标的最佳方式,但下面的代码将起作用。

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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM