「SwiftUI」DateFormatter使用和时间倒计时

IOS 时间戳计算和显示

DateFormatter使用

clojure 复制代码
		let formatter = DateFormatter() //建立DateFormatter
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"  //设置Formatter显示格式
        formatter.timeZone = TimeZone(secondsFromGMT: 8)  //设置Formatter时区

时间戳

clojure 复制代码
func CountdownTime(buyTime:String = "yyyy-MM-dd HH:mm:ss"){
		let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        formatter.timeZone = TimeZone(secondsFromGMT: 8)
        let buyDate = formatter.date(from: buyTime) //先将String转成Date类型
        let buyStamp:TimeInterval = buyDate!.timeIntervalSince1970//将Date转成时间戳
        }

通过时间戳设置一个15分钟的倒计时

输入一个String类型的时间格式,对于输入时间进行一个15分钟的倒计时,如果现在时间超过15分钟,则进行一系列需求操作,如TimeOut设为True

clojure 复制代码
func CountdownTime(buyTime:String = "yyyy-MM-dd HH:mm:ss"){
        let formatter = DateFormatter()//对于输入的时间进行格式和时间戳的转换
        let countdownFormatter = DateFormatter()//倒计时的时间格式和时间戳转换
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        formatter.timeZone = TimeZone(secondsFromGMT: 8)
        countdownFormatter.dateFormat = "mm:ss"
        countdownFormatter.timeZone = TimeZone(secondsFromGMT: 8)
        let buyDate = formatter.date(from: buyTime)
   //将输入的String转换成时间格式总会多8个小时,因为时区的原因吧,不知道为什么加了时区仍然会出问题
        let buyStamp:TimeInterval = buyDate!.timeIntervalSince1970
        let now = Date() //获取一个现在的时间
        let nowStamp:TimeInterval = now.timeIntervalSince1970
        let countdownStamp:TimeInterval = buyStamp - 28800 + 900 - nowStamp
        //输入时间-多出的8小时的时间戳+15分钟倒计时时间戳-现在的时间戳 = 倒计时时间戳
        let countdownDate:Date = Date(timeIntervalSince1970: countdownStamp)
        let countdownString:String = countdownFormatter.string(from: countdownDate)
        //将倒计时用String的形式展示
        self.countdownTime = countdownString
        if(countdownStamp <= 0){
            self.TimeOut = true  //15分钟倒计时结束后,TimeOut变为True
            self.countdownTime = "00:00"
            self.timer.upstream.connect().cancel()
        }
    }

页面实时展示,则需要使用.onReceive(timer)进行实时轮询

部分相关代码如下

clojure 复制代码
 @State var countdownTime = "00:00"
    private let timer = Timer.publish(every: 1, on: .current, in: .common).autoconnect()
    var body: some View {
        VStack{
            HStack{
                      Group{
                               Text("剩余时间:")
                               Text(countdownTime)
                           }
                           .onReceive(timer) { value in
                               CountdownTime(buyTime: "2022-04-20 13:30:30")
                           }
                        }
        }
    }

    func CountdownTime(buyTime:String = "yyyy-MM-dd HH:mm:ss"){
            let formatter = DateFormatter()
            let countdownFormatter = DateFormatter()
            formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
            formatter.timeZone = TimeZone(secondsFromGMT: 8)
            countdownFormatter.dateFormat = "mm:ss"
            countdownFormatter.timeZone = TimeZone(secondsFromGMT: 8)
            let buyDate = formatter.date(from: buyTime)
            let buyStamp:TimeInterval = buyDate!.timeIntervalSince1970
            let now = Date()
            let nowStamp:TimeInterval = now.timeIntervalSince1970
            let countdownStamp:TimeInterval = buyStamp - 28800 + 900 - nowStamp
            let countdownDate:Date = Date(timeIntervalSince1970: countdownStamp)
            let countdownString:String = countdownFormatter.string(from: countdownDate)
            self.countdownTime = countdownString
            if(countdownStamp <= 0){
                self.countdownTime = "00:00" //如果倒计时结束,倒计时一直显示00:00
                self.timer.upstream.connect().cancel()
            }
        }

页面显示效果

  • 可以自己通过调整DateFormatter中的显示格式展示自己所需求的格式
  • 时间戳也可以获取从现在的时间到输入的时间的时间戳,具体可访问Apple官方开发文档

developer.apple.com/documentati...

相关推荐
struggle202515 小时前
Ollmao (OH-luh-毛程序包及源码) 是一款原生 SwiftUI 应用程序,它与 Ollama 集成,可在 Mac 上本地运行强大的 AI 模型
ios·swiftui·swift
货拉拉技术1 个月前
货拉拉用户端SwiftUI踩坑之旅
ios·swiftui·swift
ZacJi1 个月前
巧用 allowsHitTesting 自定义 SignInWithAppleButton
ios·swiftui·swift
刘争Stanley1 个月前
SwiftUI 是如何改变 iOS 开发游戏规则的?
ios·swiftui·swift
1024小神1 个月前
在swiftui中使用Alamofire发送请求获取github仓库里的txt文件内容并解析
ios·github·swiftui
大熊猫侯佩1 个月前
SwiftUI 撸码常见错误 2 例漫谈
swiftui·xcode·tag·tabview·preview·coredata·fetchrequest
东坡肘子2 个月前
肘子的 Swift 周报 #063|异种肾脏移植取得突破
swiftui·swift·apple
恋猫de小郭2 个月前
什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap
flutter·ios·swiftui
靴子学长2 个月前
iOS + watchOS Tourism App(含源码可简单复现)
mysql·ios·swiftui
hxx2212 个月前
iOS swift开发系列--如何给swiftui内容视图添加背景图片显示
ios·swiftui·swift