我有以下格式化程序:
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .short
dateFormatter.doesRelativeDateFormatting = true我的目标是把我的日期变成字符串,比如:
今天下午3点
明天下午3点
九月二十七日下午三时
它适用于今天或明天的日期,但对于超过该日期的日期,我希望采用以下格式:
九月二十七日太阳下午四时
当我在3天后打印dateFormatter.string(from: DATE)的结果时,我会得到以下结果:
Sep 27, 2020 at 4 PM
有什么方法可以定制dateStyle,这样我就可以得到所需的字符串了吗?我处理了.full、.short等问题,但想按我的方式定制它。
发布于 2020-09-26 16:23:39
下面是一个Locale-independent解决方案:
Date是否是相对的为此,您可以使用日历函数、.isDateInYesterday(date:)等。
private func isDateRelative(_ date: Date) -> Bool {
Calendar.current.isDateInYesterday(date)
|| Calendar.current.isDateInToday(date)
|| Calendar.current.isDateInTomorrow(date)
}localizedFormat中的日期替换date部件,但保持time部件不变。DateFormatter 扩展
extension DateFormatter {
func relativeStringWithFormat(from date: Date, localizedFormat: String) -> String {
if isDateRelative(date) {
return relativeDateTimeString(from: date)
}
let dateStr = localizedDateString(from: date, localizedFormat: localizedFormat)
let timeStr = relativeTimeString(from: date)
return dateStr + timeStr
}
private func relativeDateTimeString(from date: Date) -> String {
dateStyle = .medium
timeStyle = .short
doesRelativeDateFormatting = true
return string(from: date)
}
private func relativeDateString(from date: Date) -> String {
dateStyle = .medium
timeStyle = .none
doesRelativeDateFormatting = true
return string(from: date)
}
private func relativeTimeString(from date: Date) -> String {
relativeDateTimeString(from: date).replacingOccurrences(of: relativeDateString(from: date), with: "")
}
private func localizedDateString(from date: Date, localizedFormat: String) -> String {
setLocalizedDateFormatFromTemplate(localizedFormat)
doesRelativeDateFormatting = false
return string(from: date)
}
private func isDateRelative(_ date: Date) -> Bool {
Calendar.current.isDateInYesterday(date)
|| Calendar.current.isDateInToday(date)
|| Calendar.current.isDateInTomorrow(date)
}
}测试
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US")
let today = Date()
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: today)!
let nextWeek = Calendar.current.date(byAdding: .day, value: 7, to: today)!
let localizedFormat = "EEE d MMM"print(dateFormatter.relativeStringWithFormat(from: today, localizedFormat: localizedFormat))
// Today at 6:20 PM
print(dateFormatter.relativeStringWithFormat(from: tomorrow, localizedFormat: localizedFormat))
// Tomorrow at 6:20 PM
print(dateFormatter.relativeStringWithFormat(from: nextWeek, localizedFormat: localizedFormat))
// Sat, Oct 3 at 6:20 PM发布于 2020-09-24 23:35:11
试着这样做:
dateformater.dateformat = "E, d MMM yyyy HH:mm:ss"产出:11 2018年9月12日14:11:54
发布于 2020-09-25 00:13:46
下面是一个DateFormatter子类,它应该为您提供所需的东西。请注意,我处理了“昨天”的案件,即使你没有在你的问题中提到它。还请注意,如果要显示时间,而不是仅显示小时部分,则需要调整dateFormat字符串的"ha“部分。
class MyDateFormatter: DateFormatter {
override init() {
super.init()
amSymbol = "am"
pmSymbol = "pm"
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func string(from date: Date) -> String {
setDateFormat(forDate: date)
return super.string(from: date)
}
private func setDateFormat(forDate date: Date) {
if calendar.isDateInYesterday(date) {
dateFormat = "'Yesterday' 'at' ha"
return
} else if calendar.isDateInToday(date) {
dateFormat = "'Today' 'at' ha"
return
} else if calendar.isDateInTomorrow(date) {
dateFormat = "'Tomorrow' 'at' ha"
return
}
dateFormat = "E MMM d 'at' ha"
}
}只需像使用普通的DateFormatter一样使用它:
let formatter = MyDateFormatter()
let dateStr = formatter.string(from: Date())
print(dateStr) // Today at 12pmhttps://stackoverflow.com/questions/64055684
复制相似问题