Swift:12小时制日期转24小时制及转换异常问题求助
解决iOS中12小时制Date与24小时制字符串的转换问题
嘿,我完全懂你现在的困惑!其实这里的核心误区是:Date类型本身根本没有「12小时制」或「24小时制」的属性——它本质上只是一个记录UTC时间戳的对象,你看到的带a. m.的格式,只是系统默认把Date转换成字符串时,根据你的iPhone区域设置(西班牙语墨西哥)生成的展示形式而已,和Date内部存储的时间毫无关系。
一步步理清问题:
Date的本质:它只是一个时间点
当你打印Date对象时,系统调用的是它的description方法,会自动根据当前设备的区域、时区生成可读字符串,但这只是调试用的输出,不是Date的真实内容。比如你看到的2018-03-21 5:14:59 a. m. +0000,其实对应的UTC时间就是2018-03-20 23:14:59——不管怎么显示,Date存储的时间戳是固定的。正确生成24小时制字符串
要用DateFormatter来控制输出格式,手动指定24小时制的格式字符串,同时设置好时区(避免时区转换错误)。示例代码:// 假设这是你获取到的原始Date对象 let originalDate = Date() let formatter = DateFormatter() // 指定24小时制的格式:HH代表24小时,hh是12小时 formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" // 如果你要生成UTC时间的字符串,就设置时区为UTC;要本地时区就用TimeZone.current formatter.timeZone = TimeZone(identifier: "UTC") // 生成24小时制字符串 let twentyFourHourStr = formatter.string(from: originalDate) // 此时twentyFourHourStr就是类似"2018-03-20 23:14:59"的字符串把24小时制字符串转回Date的正确姿势
转回Date时,必须使用和生成字符串时完全相同的格式、时区的DateFormatter,否则会解析出错或者得到错误的时间。示例代码:let parseFormatter = DateFormatter() // 和生成字符串时的格式一致 parseFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" // 时区也要一致,比如同样设为UTC parseFormatter.timeZone = TimeZone(identifier: "UTC") if let parsedDate = parseFormatter.date(from: twentyFourHourStr) { // parsedDate就是正确的Date对象,它的时间戳和originalDate完全一致 // 如果你打印它,系统还是会用设备默认的西班牙语墨西哥区域显示成12小时制,但这只是展示问题!实际时间是对的 }
最后提醒:
不要纠结Date对象的默认打印格式——那只是给开发者看的调试信息。如果需要以24小时制展示给用户或者存储,就用DateFormatter生成对应的字符串;如果要解析字符串回Date,一定要保证Formatter的格式、时区和生成时完全匹配,这样就能确保时间的准确性啦!
内容的提问来源于stack exchange,提问作者jorge_mr
相关产品推荐
相关产品推荐

