比较 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