比较 swift 中的两个日期以检查一天是否已经过去
Comparing two dates in swift in order to check if a day has gone by
在我的程序中,我有一个 "reset" 按钮,我想让它在用户每天第一次打开应用程序时出现。因此,当加载视图时,我创建了一个变量来保存今天是哪一天(即:19),然后将这一天设置为用户默认值。然后我使用 if 语句来确定用户默认值是否等于实际日期。我无法完全弄清楚 "reset" 按钮的隐藏和取消隐藏。
这是我目前的代码。我是 swift 的新手,因此非常感谢对我的方法提出任何建议或反馈!谢谢
class UserInfoViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let date = Date()
let calendar = Calendar.current
let dateToday = calendar.component(.day, from: date)
let dateToCompare = calendar.component(.day , from: date)
UserDefaults.standard.set(dateToday, forKey: "userDefaultDate")
let userDefaultDate = UserDefaults.standard.value(forKey: self.userDefaultDate) as? Int
if userDefaultDate != dateToCompare {
resetLabel.isHidden = false
UserDefaults.standard.set(dateToCompare, forKey: "userDefaultDate")
}
if userDefaultDate == dateToCompare {
resetLabel.isHidden = true
}
}
让我修改你的代码:
class UserInfoViewController: UIViewController {
let userDefaultDate = "userDefaultDate"
override func viewDidLoad() {
super.viewDidLoad()
let date = Date()
let calendar = Calendar.current
let dateToCompare = calendar.component(.day , from: date)
let userDefaultDate = UserDefaults.standard.integer(forKey: "userDefaultDate")
if userDefaultDate != dateToCompare {
resetLabel.isHidden = false
UserDefaults.standard.set(dateToCompare, forKey: self.userDefaultDate)
} else {
resetLabel.isHidden = true
}
}
你错了,你在检查之前设置了用户默认值。所以你的比较总是相等的。这行我的意思是:UserDefaults.standard.set(dateToday, forKey: "userDefaultDate")
您的代码无法运行。
逻辑应该是:
- 从
UserDefaults
、 中获取日期
- 将它与当天进行比较。
- 如果值不相等,将新的一天保存为
UserDefaults
class UserInfoViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let dateToday = Calendar.current.component(.day, from: Date())
let dateToCompare = UserDefaults.standard.integer(forKey: "userDefaultDate")
if dateToCompare != dateToCompare {
UserDefaults.standard.set(dateToday, forKey: "userDefaultDate")
resetLabel.isHidden = false
} else {
resetLabel.isHidden = true
}
}
}
注:
切勿将 value(forKey:
与 UserDefaults
一起使用。
有很多方便的方法,对于对象使用 object(forKey:
编辑
保存Date
对象和使用Calendar
的isDateInToday
比较靠谱
class UserInfoViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let dateToday = Date()
let calendar = Calendar.current
let dateToCompare = UserDefaults.standard.object(forKey: "userDefaultDate") as? Date ?? Date.distantPast
if calendar.isDateInToday(dateToCompare) {
resetLabel.isHidden = true
} else {
UserDefaults.standard.set(dateToday, forKey: "userDefaultDate")
resetLabel.isHidden = false
}
}
}
试试这个,希望能帮到你。
override func viewDidLoad() {
super.viewDidLoad()
let date = Date()
let calendar = Calendar.current
let dateToday = calendar.component(.day, from: date)
let dateToCompare = Int(calendar.component(.day , from: date))
UserDefaults.standard.set(dateToday, forKey: "userDefaultDate")
let userDefaultDate = UserDefaults.standard.value(forKey: "userDefaultDate") as? Int
if userDefaultDate != dateToCompare {
UserDefaults.standard.set(dateToCompare, forKey: "userDefaultDate")
resetLabel.isHidden = true
} else {
resetLabel.isHidden = true
}
}
在此代码中,如果 userDefaultDate != dateToCompare,dateToCompare 保存在 UserDefaults 中并隐藏你的 resetLabel,否则如果 userDefaultDate = dateToCompare,它只是隐藏你的 resetLabel
但是如果你需要 show resetLabel if userDefaultDate != dateToCompare 你会改变这个:
UserDefaults.standard.set(dateToCompare, forKey: "userDefaultDate")
resetLabel.isHidden = false
您将无法实现您的要求,因为 dateToday 和 dateToCompare 总是相等的。如果您想要按钮操作,您可能还想使用按钮而不是标签 (resetLabel)。
试试这个代码:
override func viewDidLoad() {
super.viewDidLoad()
let presentDate = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/mm/yyyy"
let dateString = dateFormatter.string(from: presentDate)
guard let userDefaultDate = UserDefaults.standard.object(forKey: "userDefaultDate") as? String else {
UserDefaults.standard.set(dateString, forKey: "userDefaultDate") //this line would be executed when you are setting the date for the first time, i.e on your first app launch.
resetLabel.isHidden = true
return
}
if userDefaultDate != dateString {
resetLabel.isHidden = false
UserDefaults.standard.set(dateString, forKey: "userDefaultDate")
} else {
resetLabel.isHidden = true
}
}
在这里,我将日期转换为 dd/mm/yyyy 格式的字符串,并将其保存在 UserDefaults
中
在我的程序中,我有一个 "reset" 按钮,我想让它在用户每天第一次打开应用程序时出现。因此,当加载视图时,我创建了一个变量来保存今天是哪一天(即:19),然后将这一天设置为用户默认值。然后我使用 if 语句来确定用户默认值是否等于实际日期。我无法完全弄清楚 "reset" 按钮的隐藏和取消隐藏。
这是我目前的代码。我是 swift 的新手,因此非常感谢对我的方法提出任何建议或反馈!谢谢
class UserInfoViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let date = Date()
let calendar = Calendar.current
let dateToday = calendar.component(.day, from: date)
let dateToCompare = calendar.component(.day , from: date)
UserDefaults.standard.set(dateToday, forKey: "userDefaultDate")
let userDefaultDate = UserDefaults.standard.value(forKey: self.userDefaultDate) as? Int
if userDefaultDate != dateToCompare {
resetLabel.isHidden = false
UserDefaults.standard.set(dateToCompare, forKey: "userDefaultDate")
}
if userDefaultDate == dateToCompare {
resetLabel.isHidden = true
}
}
让我修改你的代码:
class UserInfoViewController: UIViewController {
let userDefaultDate = "userDefaultDate"
override func viewDidLoad() {
super.viewDidLoad()
let date = Date()
let calendar = Calendar.current
let dateToCompare = calendar.component(.day , from: date)
let userDefaultDate = UserDefaults.standard.integer(forKey: "userDefaultDate")
if userDefaultDate != dateToCompare {
resetLabel.isHidden = false
UserDefaults.standard.set(dateToCompare, forKey: self.userDefaultDate)
} else {
resetLabel.isHidden = true
}
}
你错了,你在检查之前设置了用户默认值。所以你的比较总是相等的。这行我的意思是:UserDefaults.standard.set(dateToday, forKey: "userDefaultDate")
您的代码无法运行。
逻辑应该是:
- 从
UserDefaults
、 中获取日期
- 将它与当天进行比较。
- 如果值不相等,将新的一天保存为
UserDefaults
class UserInfoViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let dateToday = Calendar.current.component(.day, from: Date())
let dateToCompare = UserDefaults.standard.integer(forKey: "userDefaultDate")
if dateToCompare != dateToCompare {
UserDefaults.standard.set(dateToday, forKey: "userDefaultDate")
resetLabel.isHidden = false
} else {
resetLabel.isHidden = true
}
}
}
注:
切勿将 value(forKey:
与 UserDefaults
一起使用。
有很多方便的方法,对于对象使用 object(forKey:
编辑
保存Date
对象和使用Calendar
isDateInToday
比较靠谱
class UserInfoViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let dateToday = Date()
let calendar = Calendar.current
let dateToCompare = UserDefaults.standard.object(forKey: "userDefaultDate") as? Date ?? Date.distantPast
if calendar.isDateInToday(dateToCompare) {
resetLabel.isHidden = true
} else {
UserDefaults.standard.set(dateToday, forKey: "userDefaultDate")
resetLabel.isHidden = false
}
}
}
试试这个,希望能帮到你。
override func viewDidLoad() {
super.viewDidLoad()
let date = Date()
let calendar = Calendar.current
let dateToday = calendar.component(.day, from: date)
let dateToCompare = Int(calendar.component(.day , from: date))
UserDefaults.standard.set(dateToday, forKey: "userDefaultDate")
let userDefaultDate = UserDefaults.standard.value(forKey: "userDefaultDate") as? Int
if userDefaultDate != dateToCompare {
UserDefaults.standard.set(dateToCompare, forKey: "userDefaultDate")
resetLabel.isHidden = true
} else {
resetLabel.isHidden = true
}
}
在此代码中,如果 userDefaultDate != dateToCompare,dateToCompare 保存在 UserDefaults 中并隐藏你的 resetLabel,否则如果 userDefaultDate = dateToCompare,它只是隐藏你的 resetLabel
但是如果你需要 show resetLabel if userDefaultDate != dateToCompare 你会改变这个:
UserDefaults.standard.set(dateToCompare, forKey: "userDefaultDate")
resetLabel.isHidden = false
您将无法实现您的要求,因为 dateToday 和 dateToCompare 总是相等的。如果您想要按钮操作,您可能还想使用按钮而不是标签 (resetLabel)。
试试这个代码:
override func viewDidLoad() {
super.viewDidLoad()
let presentDate = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/mm/yyyy"
let dateString = dateFormatter.string(from: presentDate)
guard let userDefaultDate = UserDefaults.standard.object(forKey: "userDefaultDate") as? String else {
UserDefaults.standard.set(dateString, forKey: "userDefaultDate") //this line would be executed when you are setting the date for the first time, i.e on your first app launch.
resetLabel.isHidden = true
return
}
if userDefaultDate != dateString {
resetLabel.isHidden = false
UserDefaults.standard.set(dateString, forKey: "userDefaultDate")
} else {
resetLabel.isHidden = true
}
}
在这里,我将日期转换为 dd/mm/yyyy 格式的字符串,并将其保存在 UserDefaults
中