我们得到了什么:日期和时间(格式yyyy-mm-dd hh:mm a)
我们在寻找什么:时差(以分钟为单位)
什么操作:NewDate-OldDate
所以,我想知道如何才能实现上述目标?我想将日期和时间格式化为美国,而不管用户使用哪种语言环境。我该怎么办?
然后我将'oldTime'保存到UserDefaults中,并用于以后的计算。目标是使用户延迟5分钟,然后进行计算以确定用户是否应该延迟。
答案 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)
}