SwiftUI:DatePicker/Date() 格式化

SwiftUI: DatePicker/Date() formating

我有一个 .sheet 元素,当用户添加到日历时,它充当表单。一切都按预期进行,但是一旦他们提交并将日期、开始时间和结束时间上传到保存它的 firebase 中,我就注意到了一个问题。日期和时间的格式很奇怪。

我的问题是,如何在存储时将 var scheduledate 更改为 mm/dd/yy 格式,以及如何在存储时将 var starttime 和 var endtime 更改为 h:mm 格式。

这是我的代码:

struct SheetView: View {

var userEmail = Auth.auth().currentUser?.email
@Environment(\.dismiss) var dismiss
@State private var scheduledate = Date() //Store this as mm/dd/yy
@State private var startTime = Date() //Store this as h:mm
@State private var endTime = Date() //Store this as h:mm
@State private var scheduleairplane = ""
@State private var scheduleinstructor = ""

var body: some View {
    VStack {
        HStack {
            Text("New Flight")
                .font(.title)
                .fontWeight(.bold)
            Spacer()
            Button("Cancel") {
                dismiss()
            }
            
        }
        .padding()
        VStack {
            DatePicker("Date", selection: $scheduledate, displayedComponents: .date)
                .datePickerStyle(GraphicalDatePickerStyle())
                .frame(maxHeight: 400)
            DatePicker("Start Time", selection: $startTime, displayedComponents: .hourAndMinute)
                .datePickerStyle(GraphicalDatePickerStyle())
                .padding(.leading)
            DatePicker("End Time", selection: $endTime, displayedComponents: .hourAndMinute)
                .datePickerStyle(GraphicalDatePickerStyle())
                .padding(.leading)
        }
        VStack {
            TextField("Airplane...", text: self.$scheduleairplane)
                .padding([.leading, .trailing])
                .offset(x: 10)
                .frame(height: 30)
                .overlay(
                    RoundedRectangle(cornerRadius: 30)
                        .stroke(Color.white, lineWidth: 1)
                        .padding([.leading, .trailing])
                )
            TextField("Instructor...", text: self.$scheduleinstructor)
                .padding([.leading, .trailing])
                .offset(x: 10)
                .frame(height: 30)
                .overlay(
                    RoundedRectangle(cornerRadius: 30)
                        .stroke(Color.white, lineWidth: 1)
                        .padding([.leading, .trailing])
                )
        }
        
        Spacer(minLength: 0)
        Button(action: {
            let doc = db.collection("Scheduled").document("\(userEmail ?? "Error")")

            // Atomically add a new region to the "regions" array field.
            doc.updateData([
                "Airplanes": FieldValue.arrayUnion(["\(scheduleairplane)"])
            ])
            doc.updateData([
                "Date": FieldValue.arrayUnion(["\(scheduledate)"])
            ])
            doc.updateData([
                "Time": FieldValue.arrayUnion(["\(ScheduledTime)"])
            ])
            doc.updateData([
                "Instructor": FieldValue.arrayUnion(["\(scheduleinstructor)"])
            ])
        }) {
            Text("Submit")
        }
        .foregroundColor(.white)
        .frame(width: 120, height: 45)
        .background(Color("Blue"))
        .cornerRadius(30)
        .padding(.bottom)
         }
     }
 }
class GeneralExtension{
    static func DateToStr(date:Date,format:String = "yyyy/MM/dd HH:mm:ss")->String{
        let timeFormatter = DateFormatter()
        timeFormatter.locale = Locale.current 
        timeFormatter.timeZone = TimeZone.current 
        timeFormatter.dateFormat = format
        let nowTimestr = timeFormatter.string(from: date)
        return nowTimestr
    }
    static func StrToDate(dateStr:String,format:String = "yyyy/MM/dd HH:mm:ss")->Date{
        var cbDate:Date = Date()
        if(!dateStr.isEmpty){
            let dateFormatter=DateFormatter()
            dateFormatter.dateFormat=format
            let tmpDate = dateFormatter.date(from: dateStr)
            if let tmpDate = tmpDate{
                cbDate = tmpDate
            }
        }
        return cbDate
    }   
}

例子

GeneralExtension.DateToStr(date: dateSetting,format: "MM")

extension String{
    func StrToDate(format:String = "yyyy/MM/dd HH:mm:ss")->Date{
        var cbDate:Date = Date()
        if(!self.isEmpty){
            let dateFormatter=DateFormatter()
            dateFormatter.dateFormat=format
            let tmpDate = dateFormatter.date(from: self)
            if let tmpDate = tmpDate{
                cbDate = tmpDate
            }
        }
        return cbDate
    }
}

extension Date{
    func DateToStr(format:String = "yyyy/MM/dd HH:mm:ss")->String{
        let timeFormatter = DateFormatter()
        timeFormatter.locale = Locale.current
        timeFormatter.timeZone = TimeZone.current
        timeFormatter.dateFormat = format
        
        let nowTimestr = timeFormatter.string(from: self)
        return nowTimestr
    }
}

例子

let date = Date()
let dateStr = date.DateToStr("MM")
let convertDate = dateStr.StrToDate()

感谢所有帮助,但我找到了答案 here 效果很好而且很简单。

我在单击按钮时使用了 3 个不同的功能 运行。然后我用新值将它们发送到 firebase。

func updateDate() {
let selecteddate = scheduleddate //Here it gets the date and saves as another variable
let formatter1 = DateFormatter()
formatter1.dateStyle = .short
//I then made a saved string called newscheduledate to use this new variable anywhere in my project.
newscheduledate = formatter1.string(from: selecteddate) //Here is when it sets the conversion to a string which I used when I sent to firebase.
}

然后我在下面的这段代码中使用了两次,开始时间和结束时间。

func updateTime() {
let selectedtime = startTime //Here it gets the date
let formatter2 = DateFormatter()
formatter2.timeStyle = .medium
//I have a saved string called newstarttime to use this new variable anywhere in my project.
newstarttime = formatter2.string(from: selectedtime)
}