Go Snippets

Go Unix 时间戳代码片段

Go 示例,涵盖 Unix 秒、毫秒、纳秒,将时间戳转换为 time.Time,以及用 RFC3339 或自定义布局格式化。

Current Unix timestamp (seconds)
package main

import "time"

func main() {
    ts := time.Now().Unix()
}
Current Unix timestamp (milliseconds)
time.Now().UnixMilli()
Current Unix timestamp (nanoseconds)
time.Now().UnixNano()
time.Time from Unix timestamp
import "time"

t := time.Unix(1700000000, 0)
t.UTC()  // ensure UTC
Formatted string
import "time"

t := time.Unix(1700000000, 0)
t.Format(time.RFC3339)          // "2023-11-15T06:13:20Z"
t.Format("2006-01-02 15:04:05") // custom layout
Timestamp from time.Time
import "time"

t, _ := time.Parse(time.RFC3339, "2023-11-15T06:13:20Z")
t.Unix()

Go 时间戳基础

Go 的 time 包为 Unix 秒、毫秒和纳秒提供了直接的辅助函数。秒用 time.Now().Unix(),与 JavaScript 兼容的毫秒用 time.Now().UnixMilli()。

格式化 time.Time 值

用 time.Unix(seconds, 0) 从 Unix 秒创建 time.Time,然后在需要确定性输出时调用 UTC()。对于 API 响应,RFC3339 通常是最佳的字符串格式。

Go 生产注意事项

Go 的 time.Time 携带一个位置(location),但 Unix 时间戳始终表示单一的 UTC 时刻。在 API 和数据库边界对时间戳进行归一化,然后在用户或业务规则需要本地时间时用明确的位置进行格式化。这能让比较保持简单,并防止服务器本地设置改变输出。

  • 日志、队列和数据库字段中的 Unix 秒用 time.Now().Unix()
  • 与 JavaScript 兼容的值用 time.Now().UnixMilli()
  • 在格式化确定性字符串之前用 time.Unix(seconds, 0).UTC()
  • API 响应用 time.RFC3339 或 time.RFC3339Nano

FAQ

应该存储 time.Time 还是 Unix 秒?
当你需要日历操作时,在 Go 内部使用 time.Time。当值需要被索引、查询或与其他系统共享时,存储 Unix 秒或数据库时间戳类型。
time.Unix 期望什么单位?
time.Unix 期望把秒和纳秒作为分开的参数。如果你收到的是毫秒,请在调用 time.Unix 之前拆分或转换该值。
如何验证 Go 的输出?
用 t.UTC().Format(time.RFC3339) 格式化该值,并把它与你写入的 API、队列或数据库列所期望的时间戳比较。