IOS 时间戳计算和显示
DateFormatter使用
let formatter = DateFormatter() //建立DateFormatter
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" //设置Formatter显示格式
formatter.timeZone = TimeZone(secondsFromGMT: 8) //设置Formatter时区
时间戳
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
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)进行实时轮询
部分相关代码如下
@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官方开发文档
https://developer.apple.com/documentation/foundation/dateformatter/