为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中的编组/解组时间对象意外失败

Golang 中的编组/解组时间对象意外失败

Go
ibeautiful 2023-03-29 16:14:18
解组编组的时间对象失败,因为有几个字符测试声明如下:// valuesnow := time.Now()timeToJSON, _ := json.Marshal(now)var obj time.Timejson.Unmarshal(timeToJSON, &obj)然后执行以下测试逻辑:if !assert.Equal(t,    now.String(),    obj.String()) {    t.FailNow()}预期的测试通过,两个对象相等实际的它失败:--- FAIL: TestFromJSON (0.00s)    D:\dev2017\GO\src\ezsoft\apiserver_sdk\model\delete\deleteModel_test.go:94:             Error Trace:    deleteModel_test.go:94            Error:          Not equal:                             expected: "2018-09-04 10:36:18.3627338 -0400 EDT m=+0.014000801"                            actual  : "2018-09-04 10:36:18.3627338 -0400 EDT"                                                        Diff:                            --- Expected                            +++ Actual                            @@ -1 +1 @@                            -2018-09-04 10:36:18.3627338 -0400 EDT m=+0.014000801                            +2018-09-04 10:36:18.3627338 -0400 EDT            Test:           TestFromJSONFAILFAIL    ezsoft/apiserver_sdk/model/delete   1.336sError: Tests failed.笔记我注意到,在检查输出时,不知何故,一些m=+[blah]被附加到预期/实际。但是,我不知道为什么,浏览 RFC 3339也没有给我任何提示。
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

根据文档,该m值是单调时钟值,可以将其删除用于Truncate比较而不是出于计时目的。该m字段不匹配,因为它从 JSON 中省略,它仅由time.Now().


像这样尝试:


// values

now := time.Now().Truncate(0)  // Truncate to remove monotonic clock portion

timeToJSON, _ := json.Marshal(now)

var obj time.Time

json.Unmarshal(timeToJSON, &obj)

添加单调时钟偏移是为了允许准确计时跨越挂钟更改(例如 NTP 更新、DST 更改或闰秒/拖尾)的持续时间。


查看完整回答
反对 回复 2023-03-29
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞


time.String()不是测试时间值的可靠方法(除非您也关心单调时钟值)。来自文档(添加了重点):

func(时间)字符串

func (t Time) String() string

String 返回使用格式字符串格式化的时间

"2006-01-02 15:04:05.999999999 -0700 MST"

如果时间具有单调时钟读数,则返回的字符串包含最终字段“m=±”,其中值是格式为十进制秒数的单调时钟读数。

返回的字符串用于调试;对于稳定的序列化表示,使用带有显式格式字符串的 t.MarshalText、t.MarshalBinary 或 t.Format。


对于您的用例,最好使用的输出time.MarshalText()而不是time.String()

expected, _ := now.MarshalText()
actual, _ := obj.MarshalText()
if !assert.Equal(string(expected), string(actual)) ...


查看完整回答
反对 回复 2023-03-29
  • 2 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信