swift中的相关日期格式是否不适用于未来日期

swift中的相关日期格式是否不适用于未来日期,swift,dateformatter,Swift,Dateformatter,从服务器上,我收到了到期日期。如果到期日为今天,我想显示今天,如果到期日在一周内,我想显示工作日名称。 为此,我将doesRelativeDateFormatting设置为true。从服务器上我得到了9月4日的到期日,也就是周五。当我使用RelativelDateShortFormatterWithDay将日期转换为字符串时,它返回的是2020年9月4日,而不是星期五。 我还需要在格式化程序中设置其他设置吗?对于过去的日期,这很好。考虑到问题中的格式化程序和一个特殊的工作日格式化程序 //

从服务器上,我收到了到期日期。如果到期日为今天,我想显示今天,如果到期日在一周内,我想显示工作日名称。 为此,我将doesRelativeDateFormatting设置为true。从服务器上我得到了9月4日的到期日,也就是周五。当我使用RelativelDateShortFormatterWithDay将日期转换为字符串时,它返回的是2020年9月4日,而不是星期五。
我还需要在格式化程序中设置其他设置吗?对于过去的日期,这很好。

考虑到问题中的格式化程序和一个特殊的工作日格式化程序

   /// A date formatter for displaying the complete relative date plus the time plus day, no seconds.
///
/// Examples: Today at 2:07 PM; Yesterday at 2:07 PM; Monday, Oct 7, 2018 at 5:05 AM
///
static let relativeFullDateShortFormatterWithDay: DateFormatter = {
    let formatter = DateFormatter()
    formatter.timeStyle = .short
    formatter.dateStyle = .medium
    formatter.doesRelativeDateFormatting = true
    formatter.timeZone = TimeZone.current
    formatter.locale = Locale.autoupdatingCurrent
    return formatter
}()
(如果区域设置始终相同,则英语格式可以更改为“HH:mm”处的“EEEE”)

然后,我们可以使用一个函数对日期进行格式化,首先检查第一个格式化程序是否返回类似“Today”的内容,然后返回该内容,否则检查给定日期是否在下周内,然后返回一个工作日

let weekDayFormatter = DateFormatter()
weekDayFormatter.dateFormat = "EEEE HH:mm" 
明天17:07
星期六17:07
2020年9月13日17:07


可用短语取决于日期格式化程序的区域设置;而对于将来的日期,英语可能只允许使用“明天”。如果是将来,而不是明天,我建议打印工作日(
EEEE
,如果我没记错的话)。我不想使用任何硬编码格式。在不指定格式的情况下,有什么方法可以做到这一点吗?我不理解你的说法,即这在过去的日期中可以正常工作,如果你想知道当天的名称,你需要为你的格式设置程序使用这种格式(EEEE)。在周六到17日之间,我们可以通过任何方式获得:07@AashishNagar是的,答案已经解释过了
func format(date: Date) -> String {
    formatter.doesRelativeDateFormatting = true
    let relative = formatter.string(from: date)
    formatter.doesRelativeDateFormatting = false
    let absolute = formatter.string(from: date)

    if relative != absolute {
        return relative
    }

    let calendar = Calendar.current
    let startDate = calendar.startOfDay(for: Date())
    guard let endDate = calendar.date(byAdding: .day, value: 7, to: startDate) else {
        return formatter.string(from: date)
    }

    if date > startDate && date < endDate {
        return weekDayFormatter.string(from: date)
    } else {
        return formatter.string(from: date)
    }
}
print(format(date: Date(timeIntervalSinceNow: 60 * 60 * 24 * 1)))
print(format(date: Date(timeIntervalSinceNow: 60 * 60 * 24 * 4)))
print(format(date: Date(timeIntervalSinceNow: 60 * 60 * 24 * 12)))