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

相关推荐
袁代码5 天前
SwiftUI开发教程系列 - 第1章:简介与环境配置
开发语言·ios·swiftui·swift·ios开发
今天也想MK代码9 天前
在Swift开发中简化应用程序发布与权限管理的解决方案——SparkleEasy
前端·javascript·chrome·macos·electron·swiftui
東三城14 天前
【ios】---SwiftUI开发从入门到放弃
ios·swiftui·swift·1024程序员节
今天也想MK代码17 天前
基于swiftui 实现3D loading 动画效果
ios·swiftui·swift
胖虎118 天前
SwiftUI(五)- ForEach循环创建视图&尺寸类&安全区域
ios·swiftui·swift·foreach·安全区域
zyosasa24 天前
SwiftUI 精通之路 11: 栅格布局
前端·swiftui·swift
小溪彼岸1 个月前
【iOS小组件实战】灵动岛实时进度通知
swiftui·swift
提笔忘字的帝国1 个月前
【ios】SwiftUI 混用 UIKit 的 Bug 解决:UITableView 无法滚动到底部
swiftui·bug·xcode
zyosasa1 个月前
SwiftUI 精通之路 09:ForEach 视图构造器的基础应用
swiftui·swift
提笔忘字的帝国1 个月前
【ios】在 SwiftUI 中实现可随时调用的加载框
ios·swiftui·xcode·swift