那么对方传过来int64格式的数值,我要如何与他对比?是我转换成in64与他对比,还是把他转换time.Time进行对比?
在 Go 语言开发中,最推荐的做法是:将对方传过来的 int64 转换为 time.Time,然后使用 time.Time 的原生方法进行对比。
这样做能保持你核心业务逻辑代码的"类型一致性",并且不易出错。
以下是具体的对比方式、原因以及特殊场景下的例外。
一、 推荐做法:统一转为 time.Time 对比
你可以使用 time.Unix(sec, nsec) 将 int64 秒级时间戳转换为 time.Time,然后使用 Go 官方提供的 Before()、After() 或 Equal() 方法。
代码示例:
package main
import (
"fmt"
"time"
)
func main() {
// 1. 假设这是从 pgsql 查出来的数据库时间 (time.Time)
dbTime := time.Now()
// 2. 假设这是前端/第三方传过来的 int64 时间戳
var inputInt int64 = 1779132480
// 3. 【推荐】将 int64 转为 time.Time(第二个参数表示纳秒,没有就传 0)
targetTime := time.Unix(inputInt, 0)
// 4. 使用 time.Time 自带的方法进行对比
if dbTime.Before(targetTime) {
fmt.Println("数据库时间早于传入时间")
}
if dbTime.After(targetTime) {
fmt.Println("数据库时间晚于传入时间")
}
if dbTime.Equal(targetTime) {
fmt.Println("两个时间完全相等")
}
}
为什么推荐转成 time.Time?
- 语义更清晰:在 Service 业务层中,你在处理"时间"而不是"数字",代码读起来更符合人类逻辑。
- 防范时区陷阱:
time.Unix()转换出来的时间默认是系统的本地时区(Local)。如果需要精确对比跨时区业务,转换为结构体后,你可以方便地通过.In(time.UTC)或.In(loc)统一时区,确保对比绝对准确。
二、 例外情况:什么时候可以转成 int64 对比?
只有一种情况推荐把 time.Time 转成 int64(即使用 dbTime.Unix() == inputInt):当你只需要纯粹的、不考虑时区的"秒级相等"或"单纯数字大小"对比,且发生在极其追求性能的底层逻辑中。
风险提示(为什么平时不推荐):
- 精度丢失风险:PostgreSQL 的
timestamp with zone精度通常可以达到微秒级,你的dbTime变量里其实包含了毫秒、微秒甚至纳秒。如果你调用dbTime.Unix(),它会直接抹去秒以下的所有尾数。 - 等于(Equal)失效:承接上条,如果数据库存的是
2026-05-18 19:30:00.500(带毫秒),而对方传的是秒级时间戳。如果你用dbTime.Unix() == inputInt对比,它们会相等;但如果你用dbTime.Equal(time.Unix(inputInt, 0))对比,它们会不相等(因为纳秒对不上)。- 注:如果确实要用
time.Time进行秒级相等对比,通常需要先截断:dbTime.Truncate(time.Second).Equal(targetTime)
- 注:如果确实要用
三、 总结你的开发标准
- 只要进入到业务逻辑层(Service):一律将外部入参(如
int64)在最外层(如 Controller/Handler)反序列化时,就转换成time.Time。 - 后续所有比较、计算、加减、存库:全线使用
time.Time进行操作,以此保证系统的严谨性。