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

iOS*_*PRO 5 time date ios swift

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

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

什么操作:NewDate - OldDate

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

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

the*_*ter 8

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Rob*_*Rob 6

你说:

\n\n
\n

我想将日期和时间格式化为美国,无论用户来自哪个区域设置。我怎样才能做到这一点?

\n
\n\n

指定Locale其中的一个en_US_POSIX

\n\n
let formatter = DateFormatter()\nformatter.dateFormat = "yyyy-MM-dd hh:mm a"\nformatter.locale = Locale(identifier: "en_US_POSIX")\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
    \n
  • 还有\xe2\x80\x99s 还有一个时区问题。例如,您开车离开芝加哥,从中部时区前往东部时区;你真的想考虑一小时已经过去了吗?

  • \n
  • 你真的想丢弃秒吗?如果这样做,从 8:00:00pm 到 8:00:59pm 之间的 59 秒将被视为 \xe2\x80\x9czero 分钟\xe2\x80\x9d 但 8:00:59pm 到 8:00 之间的一秒:01:00pm 将被视为 \xe2\x80\x9cone 分钟\xe2\x80\x9d。

  • \n
\n\n

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

\n\n
\n

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

\n
\n\n

如果这就是你使用这个的原因DateFormatter,我建议Date直接保存该对象。

\n\n
UserDefaults.standard.set(oldTime, forKey: "oldTime")\n
Run Code Online (Sandbox Code Playgroud)\n\n

并检索它:

\n\n
if let oldTime = UserDefaults.standard.object(forKey: "oldTime") as? Date {\n    ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

Date就计算两个物体之间的分钟数而言

\n\n
let minutes = Calendar.current\n    .dateComponents([.minute], from: date1, to: date2)\n    .minute\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
let seconds = date2.timeIntervalSince(date1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
let intervalFormatter = DateComponentsFormatter()\nintervalFormatter.allowedUnits = [.minute, .second]\nintervalFormatter.unitsStyle = .full\nlet string = intervalFormatter.string(from: date1, to: date2)\n
Run Code Online (Sandbox Code Playgroud)\n


Dan*_*iel 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)
}
Run Code Online (Sandbox Code Playgroud)