iOS中使用 Date/NSDate 来获取时间,或者对时间进行操作。
Date与String之间的转化一般通过dateformatter转化。
需要注意转化的格式不要写错,如将dd写为DD,则可能自动加30等问题。
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)
}
}
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位,注意转化的时候去除后三位。