如何在快速推中设置日期倒计时.我想要更新递减. 每秒计时.但我不明白如何解决这个问题?

  struct TimerExample: View {
    @State var currentTime = Date.now
  @State var inputDate = "2022-12-03 12:20:09"
    
    var body: some View {
        Text("The time is: \(convertDateFormat(inputDate: inputDate))")
            .padding()
            .onAppear(perform: {
                Timer.scheduledTimer(withTimeInterval:1.0, repeats: true) {
                     time in
                    currentTime = Date.now
                }
            })
         }
   func convertDateFormat(inputDate: String) -> String {

         let olDateFormatter = DateFormatter()
         olDateFormatter.dateFormat =   "yyyy-MM-dd hh:mm:ss" //"yyyy-MM-dd'T'HH:mm:ss"

         let oldDate = olDateFormatter.date(from: inputDate)

         let convertDateFormatter = DateFormatter()
         convertDateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"

         return convertDateFormatter.string(from: oldDate!)
    }
  }

推荐答案

这种方法可能是您问题的解决方案.请告诉我它是不是能用.如果我理解你的问题,那么这就是解决方案.

struct DateTimerView:View{
    
        @State private var endDateText = "25-12-2027"
            @State private var remainingTime = "Enter an end date"
            @State private var timer: Timer?
            
            var body: some View {
                VStack {
                    TextField("Enter an end date", text: $endDateText, onCommit: startTimer)
                        .padding()
                    
                    Text(remainingTime)
                        .padding()
                }
                .onDisappear(perform: stopTimer)
            }
            
            func startTimer() {
                let formatter = DateFormatter()
                formatter.dateFormat = "dd-MM-yyyy"
                
                if let endDate = formatter.date(from: endDateText) {
                    let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
                        let currentDate = Date()
                        
                        let calendar = Calendar.current
                        let difference = calendar.dateComponents([.day, .hour, .minute, .second], from: currentDate, to: endDate)
                        
                        if difference.day! > 0 {
                            remainingTime = "\(difference.day!) d  \(difference.hour!) h \(difference.minute!) m \(difference.second!) s"
                        } else if difference.hour! > 0 {
                            remainingTime = "\(difference.hour!) h  \(difference.minute!) m \(difference.second!) s"
                        } else if difference.minute! > 0 {
                            remainingTime = "\(difference.minute!) m \(difference.second!) s"
                        } else {
                            remainingTime = "\(difference.second!) s"
                        }
                        
                        if currentDate >= endDate {
                            stopTimer()
                        }
                    }
                    
                    self.timer = timer
                } else {
                    remainingTime = "Invalid date format"
                }
            }
            
            func stopTimer() {
                timer?.invalidate()
                timer = nil
            }
    }

Swift相关问答推荐

@ MainActor + Combine不一致的编译器错误

从Firebase播放音频文件不起作用

Result类型的初始值设定项失败?

UIView.convert(_ point:to:)的意外行为

如何使用Swift宏和@Observable和@Environment?

是否可以利用 Codable 从 Dictionary 初始化符合类型

在这个使用 URLSession 的简单 case 中是否创建了一个强引用循环?

我怎样才能缩短(提高效率)这段代码?

Swift Combine:如何在保留发布者结果顺序的同时进行收集?

使用 WrappingHStack 文本溢出到新行

如何更改任务栏 colored颜色 和 sf 符号 colored颜色 ?

SwiftUI Grid 中的数组旋转

如何在 SwiftUI 中正确实现Collection 夹?

展开 List 中的 HStack 以端到端但不是从上到下,因此看起来项目之间有更宽的空间

调用从 SwiftUI 视图传递到 PageViewController.Coordinator 的函数

使用 Date.ParseStrategy 将字符串解析为日期

协议扩展中的where self是什么

如何在 Swift 中使用 Crashlytics 登录?

如何停止 NSTimer.scheduledTimerWithTimeInterval

转换为 swift 3 后,视图控制器中出现奇怪的通用函数