我从API结果中得到了这样的日期格式:
dd-MM-yyyy HH:mm:ss
我要做的是从日期格式化程序中获取剩余的天/小时/分钟。所以我的情况是这样的:
这是我的日期格式化程序功能:
private func convertDate(dateString: String) -> String {
let dateFormatterGet = DateFormatter()
dateFormatterGet.dateFormat = "dd-MM-yyyy HH:mm:ss"
let dateFormatterPrint = DateFormatter()
dateFormatterPrint.dateFormat = "dd MMM yyyy"
if let date = dateFormatterGet.date(from: dateString) {
return dateFormatterPrint.string(from: date)
} else {
return " - "
}
}
我不确定如何实现这一目标,因为我还是编程新手。任何帮助将不胜感激,谢谢。
答案 0 :(得分:2)
DateComponentsFormatter
构建“剩余”字符串:
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.maximumUnitCount = 1 // or use 2 if you want
formatter.includesTimeRemainingPhrase = true
guard let string = formatter.string(from: date, to: now) else { return }
剩余3周
let formatter = RelativeDateTimeFormatter()
formatter.unitsStyle = .full
let string = formatter.localizedString(for: now, relativeTo: date)
3周之内
答案 1 :(得分:1)
您的第一步基本上是正确的。下一步是检查此时与现在之间的时差,您可以使用dateComponents(_:from:to:)
:
// you only need one date formatter!
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss"
guard let date = dateFormatter.date(from: "7-07-2020 06:00:00") else {
// the date can't be parsed! Return something sensible...
}
let now = Date()
// There is a reason why I used all three of [.day, .hour, .minute] instead of just .day...
let dateComponents = Calendar.current.dateComponents([.day, .hour, .minute], from: now, to: date)
let daysFromNow = dateComponents.day!
if daysFromNow < 7 && daysFromNow >= 0 {
// format the "xxx remaining" phrase
} else {
// reuse the same date formatter!
dateFormatter.dateFormat = "dd-MM-yyyy"
return dateFormatter.string(from: date)
}
要格式化xxx remaining
短语,我们实际上可以使用DateComponentsFormatter
!我们可以给它提供一堆选项,以及dateComponents
,它已经包含我们要格式化的所有三个日期成分!此处的关键是将maximumUnitCount
设置为1,以便仅输出最大的单位。
let componentFormatter = DateComponentsFormatter()
componentFormatter.allowedUnits = [.day, .hour, .minute]
componentFormatter.unitsStyle = .full
componentFormatter.maximumUnitCount = 1
componentFormatter.includesTimeRemainingPhrase = true
return componentFormatter.string(from: dateComponents)!