使用Prometheus Go远程写入器时时间戳字符过长致日期异常
解决Prometheus远程写入器时间戳转换异常的问题
哈哈,这个坑我之前踩过!问题出在时间戳的单位上:Prometheus远程写入协议里的样本时间戳Timestamp字段是毫秒级的(也就是自1970-01-01以来的毫秒数),而你直接把它传给日期转换工具时,工具默认把它当成了秒级时间戳,相当于把时间放大了1000倍,年份自然就跑到五万多年后了。
给你两个简单的解决办法:
方法一:拆分秒和纳秒(兼容所有Go版本)
把毫秒时间戳拆成秒数和纳秒数,传给Go标准库的time.Unix()方法:// 从毫秒时间戳中提取秒和纳秒 sec := s.Timestamp / 1000 nsec := (s.Timestamp % 1000) * 1000000 // 1毫秒 = 1e6纳秒 // 转换为时间对象 t := time.Unix(sec, nsec) // 按需要格式化输出 fmt.Printf(" %f %s\n", s.Value, t.Format("2006-01-02 15:04:05"))方法二:用专门的毫秒转换方法(Go 1.17+推荐)
Go 1.17及以后版本新增了time.UnixMilli()方法,直接支持毫秒级时间戳转换,代码更简洁:t := time.UnixMilli(s.Timestamp) fmt.Printf(" %f %s\n", s.Value, t.Format("2006-01-02 15:04:05"))
你之前手动去掉末尾三位得到的1526415583其实就是把毫秒转成了秒级时间戳,所以转换后日期正常,上面的代码就是把这个手动操作自动化啦。
内容的提问来源于stack exchange,提问作者user3347598
相关产品推荐
相关产品推荐

