Swiftui 如何使用DateFormatter显示昨天、今天和明天

Swiftui 如何使用DateFormatter显示昨天、今天和明天,swiftui,dateformatter,Swiftui,Dateformatter,目前,我一直在尝试不同的方法来实现这一壮举。 我在这里格式化它的方式生成当前日期8月30日下午6:28 import SwiftUI struct TestDate: View { var time = Date() var dateFormatter: DateFormatter { let df = DateFormatter() df.dateFormat = "MMM d, h:mm a" return df } var body: s

目前,我一直在尝试不同的方法来实现这一壮举。 我在这里格式化它的方式生成当前日期8月30日下午6:28

import SwiftUI

struct TestDate: View {
var time = Date()

var dateFormatter: DateFormatter {
    let df = DateFormatter()
    df.dateFormat = "MMM d, h:mm a"
    return df
}


var body: some View {
    Text("\(time, formatter: dateFormatter)")
}
}
这正是我想要的。但是,我希望显示昨天、今天和明天,而不是“8月30日”/相对当前日期。如何在SwiftUI中实现这一点


编辑:我的意思是当我使用日期选择器并更新日期时。我希望字符串不是“8月29日,下午6:50”,而是“昨天,下午6:50”。所有超过昨天和明天的日期都将显示为“mmmd,h:mma”

您需要
doesRelativeDateFormatting
(不要忘记添加样式),例如:


在@Asperi所说的基础上构建。我实现这一点的方法是,我编写了一个函数,以我想要的方式格式化

import SwiftUI

struct TestDate: View {
var time = Date()




var body: some View {
    Text("\(format(date: time))")
}

//this is where the function is I'm sure this could be cleaned up but here it is in its long form.
func format(date: Date) -> String {
      let calendar = Calendar.current
  if calendar.isDateInToday(date){
          let df = DateFormatter()
          df.dateStyle = .short
          df.timeStyle = .short
          df.doesRelativeDateFormatting = true
      return df.string(from: date)
      
      }
else if calendar.isDateInYesterday(date){
      let df = DateFormatter()
          df.dateStyle = .short
          df.timeStyle = .short
          df.doesRelativeDateFormatting = true
      return df.string(from: date)
  }
  else if calendar.isDateInTomorrow(date){
      let df = DateFormatter()
          df.dateStyle = .short
          df.timeStyle = .short
          df.doesRelativeDateFormatting = true
      return df.string(from: date)
      } else {
          let df = DateFormatter()
          df.dateFormat = "MMM d, h:mm a"
      return df.string(from: date)
  }
  
  }
  

我的猜测是修改时间变量,可能是减去一天,或者分别添加一天。例如,我添加了一个编辑来澄清我的意图。我的道歉当昨天、今天、明天被超过时,剩余的格式是MM dd、yyyy在h:MM a。如何保留MMM d,h:mm a格式?
import SwiftUI

struct TestDate: View {
var time = Date()




var body: some View {
    Text("\(format(date: time))")
}

//this is where the function is I'm sure this could be cleaned up but here it is in its long form.
func format(date: Date) -> String {
      let calendar = Calendar.current
  if calendar.isDateInToday(date){
          let df = DateFormatter()
          df.dateStyle = .short
          df.timeStyle = .short
          df.doesRelativeDateFormatting = true
      return df.string(from: date)
      
      }
else if calendar.isDateInYesterday(date){
      let df = DateFormatter()
          df.dateStyle = .short
          df.timeStyle = .short
          df.doesRelativeDateFormatting = true
      return df.string(from: date)
  }
  else if calendar.isDateInTomorrow(date){
      let df = DateFormatter()
          df.dateStyle = .short
          df.timeStyle = .short
          df.doesRelativeDateFormatting = true
      return df.string(from: date)
      } else {
          let df = DateFormatter()
          df.dateFormat = "MMM d, h:mm a"
      return df.string(from: date)
  }
  
  }