iOS时间转换

范稳
2023-12-01

iOS中使用 Date/NSDate 来获取时间,或者对时间进行操作。

Date与String之间的转化一般通过dateformatter转化。

需要注意转化的格式不要写错,如将dd写为DD,则可能自动加30等问题。

将Date转为字符串类型

 extension Date {
    ///将Date转化为固定格式的字符串
    ///- parameter formatter : 时间格式  例如:yyyy年MM月dd日 HH:mm:ss
    ///- warning : 时间格式基本为小写,除了:
    ///- MM:月份
    ///- HH:表示24小时制  hh:表示12小时制
    func toString(formatter: String) -> String {
        let dateFormattr = DateFormatter()
        dateFormattr.dateFormat = formatter
        return dateFormattr.string(from: self)
    }
}

字符串转Date

extension String{
    ///将字符串转化为Date
    ///- parameter formatter : 这段时间字符串的时间格式  例如:yyyy年MM月dd日 HH:mm
    ///- warning : 字符串格式与时间格式必须一一对应且特殊符号输入法一致,如示例参数中冒号为英文环境,如果字符串为中文环境,同样会错误,返回nil
    func toDate(formatter: String) -> Date? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = formatter
        formatter.locale = Locale.init(identifier: "en_US_POSIX") //Locale.init(identifier: "zh_Hans_CN")// 如果只在一个中国区使用可以用这个 // 解决网络时间解析不到 date 问题
        return dateFormatter.date(from: self)
    }
}

根据NSDateFormatter技术问答得出, 在 iOS 上,用户可以覆盖默认的 AM/PM 与 24 小时时间设置(通过设置 > 常规 > 日期和时间 > 24 小时时间),这会导致 NSDateFormatter 重写您设置的格式字符串,这可能会导致您的时间解析失败(具体就在 iOS15.4 转换出的 date 为 nil)。

解决办法,在 dateFormatter 中设置 Local,官方推荐使用地区identifier:en_US_POSIX

需要

时间戳

标准时间戳:是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

注意:iOS中的时间戳一般为10位,某些服务器传回的时间戳为13位,注意转化的时候去除后三位。

 类似资料: