当你的软件面向全球的用户时,你是否遇到了日期显示相关的问题?比如生日比实际多了或少了一天。这其实是由时区引起的,如果出现这样的问题,说明你对某些日期的处理及存储是不合理的。因为有些日期是不需要时区信息的(比如生日),而有些是需要时区信息的(比如预约时间)。
在数据库设计中,存储日期(如生日、纪念日)是一个看似简单但容易踩坑的问题。常见的两种方案是:
- 直接使用 MySQL 的
DATE
类型 - 用
BIGINT
存储 UTC 时间戳,前后端转换
那么,哪种方式更优雅?哪种更适合你的业务?今天我们就来一场 “DATE vs. 时间戳” 的终极 PK!
Round 1: 方案简介
方案 1:MySQL 的 DATE
类型
✅ 核心思想:直接存储 YYYY-MM-DD
格式的日期,不带时间及时区。
✅ SQL 示例:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
birth_date DATE -- 直接存日期,如 '1990-05-20'
);
方案 2:BIGINT
存储 UTC 时间戳
✅ 核心思想:存储该日期的 UTC 午夜 0 点毫秒时间戳,由应用层解析。
✅ SQL 示例: