php时间戳是秒级,javascript date需毫秒级,直接传入会导致时间错乱为1970年;正确做法是乘以1000,如new date(1625097600 * 1000)。

PHP时间戳是秒级整数,JavaScript Date 构造函数默认接收毫秒级时间戳——直接传入会导致时间错乱为1970年,这是最常踩的硬伤。
PHP时间戳传给JS时,new Date() 为什么总显示1970年?
因为 new Date(1625097600) 被解释为「1970年后的1625097600毫秒」,即约51.5年,实际对应1970-03-18;而 PHP 的 time() 返回的是秒数(如 1625097600 表示 2021-07-01 00:00:00 UTC)。JS 需要的是毫秒,所以必须乘以 1000。
- 错误写法:
new Date(<?php echo time(); ?>)→ 时间严重偏移 - 正确写法:
new Date(<?php echo time(); ?> * 1000) - 更安全写法(防 XSS + 类型明确):
new Date(<?php echo (int)time(); ?> * 1000)
用 JSON.stringify() 传时间戳,前端解析后仍是数字,但别误以为能直接丢给 Date
PHP 后端通常这样输出:echo json_encode(['created_at' => time()]);,前端拿到的是 { created_at: 1625097600 }。这个值仍是秒级整数,不是 Date 实例,也不能直接用于 toLocaleString() 等方法。
- 不能直接用:
new Date(data.created_at)(同上,少 ×1000) - 推荐封装转换逻辑:
const date = new Date(data.created_at * 1000) - 如果多个字段含时间戳,建议统一在 API 响应中加后缀(如
created_at_ms)或文档注明单位,避免每个地方都补乘法
json_encode() 输出中文、特殊字符导致 JS 解析失败?其实是编码和引号嵌套问题
常见报错 Uncaught SyntaxError: Unexpected token 或 Unexpected end of input,往往不是 JSON 本身错,而是 PHP 输出未转义就塞进 HTML 属性或内联 script 中。
- 错误做法:
<button onclick="handle(<?php echo json_encode($data); ?>)">...</button>→ 引号冲突、换行、HTML 特殊字符都会崩 - 正确做法一(推荐):
<div id="data" data-json="<?php echo htmlspecialchars(json_encode($data), ENT_QUOTES, 'UTF-8'); ?>">,再用 JS 读取:<code>JSON.parse(el.dataset.json) - 正确做法二:把数据注入全局变量,用
<script>window.__INIT_DATA__ = <?php echo json_encode($data); ?>;</script>,前提是该 script 在 body 底部且不被 HTML 解析器截断 - 注意:
json_encode()默认不处理 UTF-8 BOM,若文件带 BOM,前端可能静默解析失败,可用mb_substr(file_get_contents($file), 0, 3) === "\xEF\xBB\xBF"检查
时间戳单位不一致是跨语言协作中最隐蔽的“低级错误”,它不会报错,只会让时间漂移 1000 倍;而 JSON 嵌入 HTML 时的引号/编码问题,则往往在特定数据内容下才暴露——这两类问题都不在语法层面报错,调试时容易绕远路。











