如何从dateFormatter获取剩余的天/小时/分钟?

时间:2020-07-06 03:00:17

标签: ios swift

我从API结果中得到了这样的日期格式:

dd-MM-yyyy HH:mm:ss

我要做的是从日期格式化程序中获取剩余的天/小时/分钟。所以我的情况是这样的:

  1. 如果距离该日期还剩下7天或更少,则返回“剩余x天”
  2. 如果距离日期还不到24小时,则返回“剩余x小时”
  3. 如果距离日期还不到一个小时,则返回“剩余x分钟”
  4. 否则,返回“ dd-MM-yyyy”

这是我的日期格式化程序功能:

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 " - "
        }
}

我不确定如何实现这一目标,因为我还是编程新手。任何帮助将不胜感激,谢谢。

2 个答案:

答案 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周

或者,RelativeDateTimeFormatter

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)!