毫秒级长整型时间戳转秒级整型需整除1000,先除后转类型以避免溢出,不可四舍五入或误用位运算;注意负值兼容与目标类型范围(如int32限至2038年)。

长整型时间戳(如毫秒级)转为秒级整型,本质是“截断小数位”而非四舍五入,核心操作是整除或右移,关键在于类型安全和精度不丢失。
明确时间戳单位与目标类型
常见长整型时间戳多为 毫秒级(13 位,如 1717023600123),目标是转成 秒级 int(10 位,如 1717023600)。需确认原始值单位,避免误除(比如微秒要除 1_000_000,纳秒除 1_000_000_000)。
用整数除法直接降级(推荐)
对毫秒时间戳,执行 / 1000 即可。在强类型语言中,只要操作数是整型,结果自动截断(非四舍五入):
- Java:
long ms = 1717023600123L; int sec = (int) (ms / 1000); - C/C++:
int64_t ms = 1717023600123LL; int32_t sec = (int32_t)(ms / 1000); - Go:
sec := int(ms / 1000)(ms 类型为int64)
注意:先除后转,避免先转 long → int 导致溢出(如 13 位毫秒值远超 int32 上限)。
用位运算加速(仅限 2 的幂单位)
若时间戳单位是 2 的幂(如毫秒不是,但某些嵌入式系统用 16ms 或 32ms 基准),可用右移替代除法。例如单位为 16ms,则 >> 4 等价于 / 16。但毫秒→秒不适用位运算,强行用 >> 10(≈ /1024)会引入误差,不推荐。
防范溢出与负时间戳
Unix 时间戳自 1970-01-01 起算,正常为正数,但需考虑:
- 系统支持负时间戳(1970 年前),除法仍有效,符号保留
- 目标整型范围是否足够:int32 最大值约 21 亿,对应时间约到 2038 年;如需更久,用 int64 存秒值(如
long sec = ms / 1000;) - 数据库字段类型匹配:MySQL 用
INT SIGNED或BIGINT,PostgreSQL 用integer或bigint
不复杂但容易忽略

















