用户选择日期后无法显示 "Today" 而不是今天的日期

Unable to show "Today" instead of today's date after User selects date

我正在制作一个日记应用程序,用户可以在其中编辑日期时间标签。当用户点击标签时,它会弹出一个 UIDatePicker。我想这样当他们保存日期时,如果它是 "Today",那么标签将不会更新以显示今天的日期,而是显示 "Today" 这个词。这是我在 Calendar、Journal、Fitness 和任何其他允许用户编辑条目日志日期的应用程序中看到的内容。

当用户最初打开视图并看到当前日期和时间时正确显示(编程 UI):

let dateTimePicker: UIDatePicker = {
    let picker = UIDatePicker()
        picker.datePickerMode = .dateAndTime
        picker.timeZone = NSTimeZone.local
        picker.backgroundColor = UIColor.white
    return picker
}()

let dateTimeLabel: UILabel = {
    let now = Date()
    let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "en_US")
        dateFormatter.setLocalizedDateFormatFromTemplate("h:mm")
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
        label.attributedText = NSAttributedString(string: "Today, " + dateFormatter.string(from: now), attributes:[.underlineStyle: NSUnderlineStyle.single.rawValue])

    return label
}()

日期选择器作为弹出窗口打开。当用户单击 "Cancel" 时,日期和时间保持不变。当用户更改日期 and/or 时间并单击 "Save" 时,dateTimeLabel 会相应更新。但是,如果它显示 "Today, ___" 并且用户单击 "Save",则标签会将其更新为当前日期。

这是我尝试过的方法:

@objc func saveTapped() {
        let dateFormatter = DateFormatter()
            dateFormatter.locale = Locale(identifier: "en_US")

        let now = Date()
        if dateTimePicker.date == now {
            dateFormatter.setLocalizedDateFormatFromTemplate("h:mm")
            dateTimeLabel.text = "Today, " + dateFormatter.string(from: now)
        } else {
            dateFormatter.setLocalizedDateFormatFromTemplate("MMMd h:mm")
            dateTimeLabel.text = dateFormatter.string(from: dateTimePicker.date)
        }

        removePopoverView()
    }

Gif 来显示它当前正在做什么(我希望它在用户单击 "save" https://makeagif.com/i/v9mrKs 时在 dateTimeLabel 上显示 "Today" 而不是 "Apr 17"

您可以使用日历方法 isDateInToday 检查日期是否与今天相同:

if Calendar.current.isDateInToday(dateTimePicker.date) {
    // your code ...
} else if Calendar.current.isDateInYesterday(dateTimePicker.date) {
    // your code ...
} else {
    // your code ...
}

请注意 DateFormatter 有一个名为 doesRelativeDateFormatting 的 属性 正是为此目的。您只需要将它设置为 true,它会利用显示本地化字符串的优势为您处理它:


let date1 = DateComponents(calendar: .current, year: 2020, month: 4, day: 18, hour: 1).date!
let date2 = DateComponents(calendar: .current, year: 2020, month: 4, day: 17, hour: 23).date!

let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .short
dateFormatter.doesRelativeDateFormatting = true

dateFormatter.string(for: date1)  // "Today at 1:00 AM"
dateFormatter.string(for: date2)  // "Yesterday at 11:00 PM"