最近遇到在项目的一些接口请求中,需要带格式化好的日期参数 date: "2020-09-18"
(怎么都感觉用时间戳合适), 然后又因为本地数据库有存储数据对应的时间戳,所以在格式转化与获取时间戳中遇到让我感觉懵懵的情况。因此查了一些资料,做一份笔记在此,以后方便查阅。
GMT:Greenwich Mean Time 格林尼治标准时间
UTC:Coordinated Universal Time 协调世界时
GMT = UTC+0
北京时区:GMT+8
// 时间戳是UTC到1970的 时间戳
// 格林时区 date: 2020-09-18 16:05:41 +0000 日期与当前时间少了8小时
// seconds:1600445141.265026 时间戳正常
var date = Date()
print("格林时区 date: \(date)")
print("seconds:\(date.timeIntervalSince1970)")
1、将日期转成当前时区的日期
用北京时区日期 取时间戳会多出 8小时
// 转成北京时区 date: 2020-09-19 00:05:41 +0000 日期正常
// seconds:1600473941.265026 时间戳多了8小时
date = Date.dateFromGMT(date)
print("转成北京时区 date: \(date)")
print("seconds:\(date.timeIntervalSince1970)")
extension Date {
// 转成当前时区的日期
static func dateFromGMT(_ date: Date) -> Date {
let secondFromGMT: TimeInterval = TimeInterval(TimeZone.current.secondsFromGMT(for: date))
return date.addingTimeInterval(secondFromGMT)
}
}
2、日期字符串 转成 Date 格式
String 转Date 会有8小时的差值,但是转成时间戳却是正常的。这个时候如果要显示正常的日期第1点的方式
,然后又要转成时间戳存储在本地时,一定要减去8小时的差值
// 转换:String转Date date: 2020-09-18 16:05:41 +0000 日期少了8小时
// seconds:1600445141.270848 时间戳正常
let dateString = "2020-09-18"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyyMMdd"
date = dateFormatter.date(from: dateString) ?? Date()
print("转换:String转Date date: \(date)")
print("seconds:\(date.timeIntervalSince1970)")