You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:01:01