【问题标题】:Avoid precision loss when marshalling time.Time objects编组 time.Time 对象时避免精度损失
【发布时间】:2021-05-13 18:41:52
【问题描述】:

我已发送go playground 来重现我的问题。我有一些测试失败,因为 json Marshal 方法在 time.Time 对象的转换过程中似乎失去了精度。

运行以下代码:

package main

import (
    "fmt"
    "encoding/json"
    "time"
)

type myStruct struct{
    Now time.Time `json:"time"`
}

func main() {
    expect := &myStruct{Now: time.Now()}
    
    fmt.Println(expect.Now.String())
    
    byteData, err := json.Marshal(expect)
    if err != nil {
        panic(err.Error())
    }
    
    actual := &myStruct{}
    err = json.Unmarshal(byteData, &actual)
    if err != nil {
        panic(err.Error())
    }
    
    fmt.Println(actual.Now.String())
}

输出:

2009-11-10 23:00:00 +0000 UTC m=+0.000000001
2009-11-10 23:00:00 +0000 UTC

问题在于,当我运行任何涉及转换 time.Time 对象的测试时,我无法使用任何标准方法来比较结果(作证、反映...)。

有没有办法在编组time.Time 对象时保持精度,或者将时间值“四舍五入”到较低的精度?

【问题讨论】:

  • 这不是“精度”的损失。它省略了时间对象的单调部分。

标签: json go time marshalling


【解决方案1】:

使用expect := &myStruct{Now: time.Now().Local()} 或 expect := &myStruct{Now: time.Now().UTC()}。这将移除您的精密零件,您可以成功测试它。

【讨论】:

    【解决方案2】:

    也可以使用Time.Round:

    Round 返回 t 去除任何单调时钟读数,但除此之外 不变。

    所以:

    time.Now().Round(0)
    

    将去除单调偏移,使其余时间分量保持不变(时区等)

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2018-03-16
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      相关资源
      最近更新 更多