Swift Date 8小时差的问题

最近遇到在项目的一些接口请求中,需要带格式化好的日期参数 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)")

参考:NSDate 8小时问题-没你想的那么简单!

你可能感兴趣的