如何从后端获取客户端本地时间?JS传值到PHP后仍显示服务器时间怎么办
问题根因
- 你传给PHP的
toLocaleString()是客户端本地化格式的字符串,不同区域的格式差异极大,PHP的strtotime大概率无法正常解析,解析失败后会返回布尔值false,后续运算会被当作0处理,最终date函数会默认使用服务器当前时间/服务器时区格式化。 - 你PHP里的计算逻辑完全冗余:
$currentlocaltime = strtotime($localnow) - (strtotime($localnow) - $timestamp)等价于$currentlocaltime = $timestamp,等于你最后还是用服务器的时区格式化原本的时间戳,当然显示的是服务器时间。
修复方案
方案1:前端传时区偏移给后端处理(适合必须后端渲染时间的场景)
修改后的JavaScript代码
// 不要传本地化字符串,传时区偏移(单位:分钟,UTC时间减去本地时间的差值) var timeOffset = new Date().getTimezoneOffset(); xmlhttpupdates.open("POST", "updates.php", true); xmlhttpupdates.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlhttpupdates.send("time_offset="+timeOffset);
修改后的PHP代码
$timeOffset = (int)$_POST["time_offset"] * 60; // 转成秒的偏移量 foreach ($allmsgsz as $allmsgs){ $timestamp = strtotime($allmsgs[4]); // 确保$allmsgs[4]可以转成正确的Unix时间戳 // 计算客户端本地对应的时间戳 $clientTimestamp = $timestamp - $timeOffset; $time = date("Y-m-d (h:i a)", $clientTimestamp); echo $time; }
方案2:后端返回Unix时间戳,前端自行格式化(更稳定、兼容性更好)
后端PHP代码直接输出时间戳
foreach ($allmsgsz as $allmsgs){ $timestamp = strtotime($allmsgs[4]); echo $timestamp; }
前端接收后转本地时间
// 假设接收到的时间戳是serverTimestamp,PHP返回的是秒级时间戳,JS需要转成毫秒 let localTime = new Date(serverTimestamp * 1000).toLocaleString(); // 直接渲染localTime即可
内容的提问来源于stack exchange,提问作者Khalid
相关产品推荐
相关产品推荐

