如何将Go生成的time类型转换为Swift中的Date类型?
解决Swift解析Go返回的纳秒级ISO时间为Date的问题
Go的time.Now()输出的是带9位纳秒精度的ISO 8601格式时间(如"2022-10-30T21:11:52.540958635-07:00"),而Swift默认日期解析器不支持纳秒解析,导致转换后返回nil。以下是两种前端侧的解决方案:
方案一:自定义DateFormatter解析
通过指定包含纳秒的格式字符串,强制解析完整时间格式:
func convertGoTimeToDate(_ timeString: String) -> Date? { let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") // 关键:固定区域避免解析异常 formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSZ" // SSSSSSSSS对应9位纳秒 return formatter.date(from: timeString) } // 使用示例 let goTime = "2022-10-30T21:11:52.540958635-07:00" if let date = convertGoTimeToDate(goTime) { print("解析成功:\(date)") } else { print("时间格式解析失败") }
方案二:用ISO8601DateFormatter开启纳秒支持
Swift的ISO8601DateFormatter提供了更简洁的配置方式,只需开启纳秒支持选项:
func convertGoTimeWithISOFormatter(_ timeString: String) -> Date? { let formatter = ISO8601DateFormatter() formatter.formatOptions = [ .withFullDate, .withFullTime, .withFractionalSeconds, // 开启纳秒/小数秒解析 .withTimeZone ] return formatter.date(from: timeString) } // 使用示例 let goTime = "2022-10-30T21:11:52.540958635-07:00" if let date = convertGoTimeWithISOFormatter(goTime) { print("解析成功:\(date)") } else { print("时间格式解析失败") }
在Codable模型中集成解析
如果是通过Codable解码API返回的用户列表,可以自定义解码逻辑处理created_at字段:
struct User: Codable { let createdAt: Date // 其他用户字段(如id、name等) enum CodingKeys: String, CodingKey { case createdAt = "created_at" // 其他字段的key映射 } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) let timeString = try container.decode(String.self, forKey: .createdAt) let formatter = ISO8601DateFormatter() formatter.formatOptions = [ .withFullDate, .withFullTime, .withFractionalSeconds, .withTimeZone ] guard let date = formatter.date(from: timeString) else { throw DecodingError.dataCorruptedError( forKey: .createdAt, in: container, debugDescription: "无法解析created_at的时间格式" ) } self.createdAt = date // 解码其他字段 // self.id = try container.decode(Int.self, forKey: .id) // ... } }
注意事项
- 必须设置
en_US_POSIX区域给DateFormatter,避免系统区域设置(如使用逗号作为小数分隔符的地区)干扰解析。 ISO8601DateFormatter的.withFractionalSeconds支持1-9位的小数秒,适配Go返回的9位纳秒格式,比自定义格式字符串更灵活可靠。
内容的提问来源于stack exchange,提问作者darkstar
相关产品推荐
相关产品推荐

