gpt4 book ai didi

swift - 如何使用 DateComponentsFormatter 将日期显示为 "Today"或 "Yesterday"?

转载 作者:行者123 更新时间:2023-12-04 08:57:17 27 4
gpt4 key购买 nike

我在我的项目中使用 swift 并且我想显示这样的特定日期:5 天前或 5 个月前或 ...
我正在使用 DateComponentsFormatter 并且它运行良好,但问题是我想像“昨天”一样显示 1 天前或像“今天”一样显示 3 秒前。我怎样才能做到这一点?我可以使用 DateComponentsFormatter 来解决这个问题吗?这是我的代码:

func shortDate(_ local: LocaleIdentifier = .fa) -> String {

let now = Date()
let date = self

let formatter = DateComponentsFormatter()
formatter.calendar?.locale = Locale(identifier: local.rawValue)
formatter.unitsStyle = .full
formatter.maximumUnitCount = 1
formatter.allowedUnits = [.year, .month, .day, .hour, .minute, .second]

guard let timeString = formatter.string(from: date, to: now) else {
return ""
}

return String(format: "Ago".localized, timeString)
}

最佳答案

对于 iOS 13 或更高版本,您可以使用 RelativeDateTimeFormatter

let relativeDateTimeFormatter = RelativeDateTimeFormatter()
relativeDateTimeFormatter.dateTimeStyle = .named
relativeDateTimeFormatter.unitsStyle = .full
let date = Date.init(timeIntervalSinceNow: -60*60*24)
relativeDateTimeFormatter.string(for: date) // "yesterday"
编辑/更新:
如果您想支持 iOS 11,则需要实现自己的相对日期格式化程序。您可以使用 Calendar 方法 isDateInToday 和 isDateInYesterday 将相对日期格式化程序与日期组件格式化程序结合起来。请注意,无需检查在日期组件格式化程序中设置单个单位的时间间隔,您可以设置日期组件格式化程序的允许单位,只需确保根据要显示的所需优先级设置它们:
//这将避免每次调用 relativeDateFormatted 属性时创建格式化程序
extension Formatter {
static let dateComponents: DateComponentsFormatter = {
let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.allowedUnits = [.day, .month, .year] // check the order of the units it does matter when allowing only 1 unit to be displayed
dateComponentsFormatter.maximumUnitCount = 1
dateComponentsFormatter.unitsStyle = .full
return dateComponentsFormatter
}()
static let relativeDate: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.doesRelativeDateFormatting = true
dateFormatter.timeStyle = .none
dateFormatter.dateStyle = .medium
return dateFormatter
}()
}
extension Date {
var relativeDateFormatted: String {
Calendar.current.isDateInToday(self) || Calendar.current.isDateInYesterday(self) ?
Formatter.relativeDate.string(from: self) :
Formatter.dateComponents.string(from: self, to: Date()) ?? ""
}
}

游乐场测试:
let date1 = DateComponents(calendar: .current, year: 2020, month: 9, day: 4, hour: 5).date!
let date2 = DateComponents(calendar: .current, year: 2020, month: 9, day: 3, hour: 23, minute: 50).date!
let date3 = DateComponents(calendar: .current, year: 2020, month: 8, day: 25, hour: 10).date!
let date4 = DateComponents(calendar: .current, year: 2020, month: 8, day: 3).date!
let date5 = DateComponents(calendar: .current, year: 2019, month: 8, day: 27).date!

date1.relativeDateFormatted // "Today"
date2.relativeDateFormatted // "Yesterday"
date3.relativeDateFormatted // "10 days"
date4.relativeDateFormatted // "1 month"
date5.relativeDateFormatted // "1 year"

关于swift - 如何使用 DateComponentsFormatter 将日期显示为 "Today"或 "Yesterday"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63748900/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com