用户选择日期后无法显示 "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"
我正在制作一个日记应用程序,用户可以在其中编辑日期时间标签。当用户点击标签时,它会弹出一个 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"