【问题标题】:Unable to show "Today" instead of today's date after User selects date用户选择日期后无法显示“今天”而不是今天的日期
【发布时间】:2020-04-18 06:26:57
【问题描述】:

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

当用户最初打开视图并看到当前日期和时间(程序化 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
}()

日期选择器以弹出框形式打开。当用户单击“取消”时,日期和时间保持不变。当用户更改日期和/或时间并单击“保存”时,dateTimeLabel 会相应更新。但是,如果它显示“今天,___”并且用户单击“保存”,则标签会将其更新为当前日期。

这是我尝试过的:

@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(我希望它在用户点击“保存”https://makeagif.com/i/v9mrKs987654325@ 时显示“今天”而不是“4 月 17 日”https://makeagif.com/i/v9mrKs

【问题讨论】:

    标签: ios swift uidatepicker


    【解决方案1】:

    您可以使用 Calendar 方法 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"
    

    【讨论】:

    • 现在按预期工作,谢谢!不知道日历方法,所以非常感谢您提供的信息。在做了一些研究之后,我意识到我原来的 if-else 永远不会执行 if 部分,因为“now = Date()”将时间记录到毫秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多