go项目zero框架中表字段日期设置的几种格式对比与实践

220 阅读3分钟

在 GoZero 框架中,日期字段的格式通常取决于你的应用场景以及所使用的数据库类型。在 GoZero 中,日期字段的设置方式一般有两种:通过 time.Time 类型和通过字符串(例如 stringint64)。每种方式有其适用的场景和优缺点。

image.png

1. 使用 time.Time 类型(推荐方式)

在 GoZero 中,推荐使用 time.Time 类型来处理日期字段。这是因为 Go 的 time 包提供了强大的日期和时间操作功能,而 time.Time 也更容易与数据库(如 MySQL、PostgreSQL)中的 DATETIMETIMESTAMP 类型进行映射。

示例代码:使用 time.Time 类型

type User struct {
    ID        int64     `json:"id"`
    Name      string    `json:"name"`
    CreatedAt time.Time `json:"created_at"` // 使用 time.Time 类型
    UpdatedAt time.Time `json:"updated_at"`
}

配置与数据库映射

  • 数据库:在数据库中,通常将 time.Time 类型映射到 DATETIMETIMESTAMP 字段,格式为 YYYY-MM-DD HH:MM:SS
  • GoZero 框架:GoZero 内部通常会自动处理 time.Time 类型与数据库日期类型(如 DATETIMETIMESTAMP)之间的转换。

示例:数据库表设计

CREATE TABLE users (
    id BIGINT PRIMARY KEY,
    name VARCHAR(100),
    created_at DATETIME,
    updated_at DATETIME
);

格式化时间(GoZero)

GoZero 在处理 time.Time 时会自动将其转换为适当的格式。如果你需要自定义时间格式,可以通过 time.Format() 方法进行格式化。

例如,如果你希望将日期输出为 YYYY-MM-DD HH:MM:SS 格式,可以这样做:

createdAt := user.CreatedAt.Format("2006-01-02 15:04:05")

2. 使用 string 类型(不推荐)

在某些情况下,你也可以将日期存储为 string 类型,并在业务层手动处理日期的转换。这种方式较为简单,但不建议使用,因为它缺乏 time.Time 提供的日期计算和格式化功能。

示例代码:使用 string 类型

type User struct {
    ID        int64  `json:"id"`
    Name      string `json:"name"`
    CreatedAt string `json:"created_at"` // 使用 string 类型存储日期
    UpdatedAt string `json:"updated_at"`
}

格式化字符串

你需要手动在应用中将字符串转换为日期对象(time.Time),并确保它符合数据库和应用的要求。

createdAt := "2025-01-03 12:30:45"
parsedTime, err := time.Parse("2006-01-02 15:04:05", createdAt)
if err != nil {
    // 处理错误
}

3. 使用 int64 类型(Unix 时间戳)

另一种方式是将日期存储为 Unix 时间戳,即将日期转换为从 1970-01-01 00:00:00 UTC 到当前时间的秒数。Unix 时间戳是一个整数,通常是 int64 类型。

示例代码:使用 int64 类型(Unix 时间戳)

type User struct {
    ID        int64 `json:"id"`
    Name      string `json:"name"`
    CreatedAt int64  `json:"created_at"` // 使用 int64 类型存储 Unix 时间戳
    UpdatedAt int64  `json:"updated_at"`
}

在这种情况下,你通常会将 int64 类型的 Unix 时间戳转换为 time.Time,或者将其直接插入数据库。Unix 时间戳的优点是它可以非常方便地进行时间比较和计算,而且数据库存储时占用的空间较小。

格式化时间(Unix 时间戳)

createdAt := time.Unix(user.CreatedAt, 0).Format("2006-01-02 15:04:05")

数据库存储

在数据库中,你可以将时间戳存储为整数类型,通常是 BIGINT 类型:

CREATE TABLE users (
    id BIGINT PRIMARY KEY,
    name VARCHAR(100),
    created_at BIGINT,  -- 存储 Unix 时间戳
    updated_at BIGINT
);

总结

  • 推荐使用 time.Time 类型:这不仅符合 Go 的最佳实践,还能更好地与数据库中的日期类型(如 DATETIMETIMESTAMP)兼容。
  • 如果必须使用字符串或 Unix 时间戳:可以考虑将日期转换为字符串或 Unix 时间戳,但要注意,这可能需要手动管理格式化和转换操作。

大部分情况下,GoZero 会自动处理 time.Time 类型和数据库之间的映射,所以选择 time.Time 类型会更加简洁和安全。