swift中的相关日期格式是否不适用于未来日期
从服务器上,我收到了到期日期。如果到期日为今天,我想显示今天,如果到期日在一周内,我想显示工作日名称。 为此,我将doesRelativeDateFormatting设置为true。从服务器上我得到了9月4日的到期日,也就是周五。当我使用RelativelDateShortFormatterWithDay将日期转换为字符串时,它返回的是2020年9月4日,而不是星期五。swift中的相关日期格式是否不适用于未来日期,swift,dateformatter,Swift,Dateformatter,从服务器上,我收到了到期日期。如果到期日为今天,我想显示今天,如果到期日在一周内,我想显示工作日名称。 为此,我将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)))