[{"data":1,"prerenderedAt":190},["ShallowReactive",2],{"page:/zh/guides/year-2038-problem":3},{"id":4,"title":5,"body":6,"description":176,"extension":177,"eyebrow":178,"faq":179,"locale":180,"meta":181,"navigation":182,"pageType":183,"path":184,"related":179,"seo":185,"stem":188,"__hash__":189},"pages/zh/guides/year-2038-problem.md","2038 年问题",{"type":7,"value":8,"toc":164},"minimark",[9,14,23,27,30,34,37,41,44,47,97,106,109,112,115,118,122,130,142,145],[10,11,13],"h2",{"id":12},"边界在哪里","边界在哪里？",[15,16,17,18,22],"p",{},"32 位有符号整数范围是 −2,147,483,648 到 2,147,483,647。把它解释为 Unix 秒时，正数上限对应 ",[19,20,21],"code",{},"2038-01-19T03:14:07Z","；再加一秒就会在这种表示中溢出。",[10,24,26],{"id":25},"哪些系统需要检查","哪些系统需要检查？",[15,28,29],{},"旧操作系统、嵌入式设备、数据库字段和二进制协议仍可能使用 32 位有符号秒。64 位时间戳或合适的日期类型能把实际边界推到普通应用寿命之外，但必须确认完整数据链路都已升级。",[10,31,33],{"id":32},"如何测试","如何测试？",[15,35,36],{},"应在边界两侧选取数值，穿过解析器、存储、API 序列化、客户端运行时和报表工具做端到端测试。现代应用服务器并不能自动保护旧数据库列或设备协议。",[10,38,40],{"id":39},"不只看-2038-年","不只看 2038 年",[15,42,43],{},"还要检查毫秒字段的整数范围、JavaScript 安全整数和第三方 API 的日期限制。不同单位与类型可能在不同年份到达边界。",[10,45,46],{"id":46},"上限附近的三个数值",[48,49,50,63],"table",{},[51,52,53],"thead",{},[54,55,56,60],"tr",{},[57,58,59],"th",{},"Unix 秒",[57,61,62],{},"UTC 日期",[64,65,66,77,87],"tbody",{},[54,67,68,74],{},[69,70,71],"td",{},[19,72,73],{},"2147483646",[69,75,76],{},"2038-01-19 03:14:06",[54,78,79,84],{},[69,80,81],{},[19,82,83],{},"2147483647",[69,85,86],{},"2038-01-19 03:14:07",[54,88,89,94],{},[69,90,91],{},[19,92,93],{},"2147483648",[69,95,96],{},"2038-01-19 03:14:08",[15,98,99,100,105],{},"第三个值本身完全合法，只是超出了有符号 32 位整数的容量，不代表 Unix 时间定义结束。可在",[101,102,104],"a",{"href":103},"/zh/timestamp-to-date/","时间戳转日期工具","中手动选择秒核对。",[15,107,108],{},"有符号 32 位整数范围为 −2,147,483,648 至 2,147,483,647。旧系统如果溢出回绕而非拒绝写入，下一个值可能变成负数，显示到 1901 年。具体行为取决于语言、操作系统和存储实现。",[10,110,111],{"id":111},"不只检查数据库列",[15,113,114],{},"检查数据库字段、驱动绑定、API 字段类型、序列化以及应用变量。只把数据库列改大，无法解决客户端或嵌入式设备继续强制转换为 32 位整数的问题。测试边界两侧的值，写入后再读取，核对整数本身，不能只看格式化日期是否像正常结果。",[15,116,117],{},"选择整个数据链路都支持的宽整数或日期类型。无符号 32 位秒数虽然有更晚的上限，但不支持负日期，也没有解决所有协议兼容问题。",[10,119,121],{"id":120},"与浏览器和-javascript-的限制分开看","与浏览器和 JavaScript 的限制分开看",[15,123,124,125,129],{},"2038 问题针对有符号 32 位的",[126,127,128],"strong",{},"秒","。JavaScript 安全整数上限、浏览器日期范围是另外的限制。相同时刻的毫秒、微秒、纳秒数值更大，不能因为日期还没到 2038 就认为精度一定安全。",[15,131,132,136,137,141],{},[101,133,135],{"href":134},"/zh/guides/seconds-vs-milliseconds/","秒与毫秒指南","解释单位选择；",[101,138,140],{"href":139},"/zh/batch-converter/","批量转换器","可以检查迁移文件中的日期，但无法检查或修改外部系统的数据类型。",[10,143,144],{"id":144},"标准与运行时参考",[146,147,148,157],"ul",{},[149,150,151],"li",{},[101,152,156],{"href":153,"rel":154},"https://man7.org/linux/man-pages/man2/time.2.html",[155],"nofollow","Linux time(2)",[149,158,159],{},[101,160,163],{"href":161,"rel":162},"https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-time-values-and-time-range",[155],"ECMAScript Date time range",{"title":165,"searchDepth":166,"depth":166,"links":167},"",2,[168,169,170,171,172,173,174,175],{"id":12,"depth":166,"text":13},{"id":25,"depth":166,"text":26},{"id":32,"depth":166,"text":33},{"id":39,"depth":166,"text":40},{"id":46,"depth":166,"text":46},{"id":111,"depth":166,"text":111},{"id":120,"depth":166,"text":121},{"id":144,"depth":166,"text":144},"了解 32 位有符号 Unix 秒为何在 2038 年 1 月溢出、哪些系统受影响以及如何安全检查。","md","指南 / 边界",null,"zh",{},true,"guide","/zh/guides/year-2038-problem",{"title":186,"description":187},"2038 年问题详解 — Unix 时间戳上限","理解 32 位有符号 Unix 时间戳在 2038-01-19 的边界，以及现代 64 位系统如何避免该限制。","zh/guides/year-2038-problem","CmaY1gKRLH30DWWfqXdSfLXcXUqvJr-5TU_4hCzV7jg",1792032485924]