「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...

相关推荐
东坡肘子2 天前
Swift 并发正被更广泛地接纳 -- 肘子的 Swift 周报 #133
人工智能·swiftui·swift
文件夹__iOS4 天前
SwiftUI 核心选型:class + ObservableObject VS struct + @State
ios·swiftui·swift
Wenzar_6 天前
# 发散创新:SwiftUI 中状态管理的深度实践与重构艺术 在 SwiftUI 的世界里,**状态驱动 UI 是核心哲学**。但随
java·python·ui·重构·swiftui
大熊猫侯佩7 天前
GeometryReader 生存指南(下集):与恶魔共舞——陷阱、禁忌与最终救赎
swiftui·performance·layout·frame·stack·geometryreader·preferencekey
大熊猫侯佩7 天前
别被系统绑架:SwiftUI List 替换背后的底层逻辑
swiftui·swift·apple
东坡肘子9 天前
从 OpenSwiftUI 到 DanceUI:换个方式 Dive SwiftUI -- 肘子的 Swift 周报 #132
人工智能·swiftui·swift
用户794572239541310 天前
【SwiftyJSON】拯救你的 as? [String: Any]——链式 JSON 访问的正确姿势
swiftui·objective-c·swift
用户794572239541310 天前
【Moya】为什么你的 Alamofire 代码需要再封装一层?
swiftui·objective-c·swift
空中海10 天前
第二章:SwiftUI 视图基础
ios·swiftui·swift