我正在制作一个网站,用户将在其中上传问题和答案。现在我需要获得用户的时区,我可以将其存储在变量$TimeZoneNameTo中,而不仅仅是"亚洲/加德满都"。无论如何,时区作为字符串将被检测并存储在变量$TimeZoneNAmeTo中,因此对于任何时区的任何用户,datetime将被转换为他/她的时区,而不是UTC,同时显示。
$TimeZoneNameFrom="UTC";
$TimeZoneNameTo="Asia/Kathmandu";
echo "uploaded on".$upload_date;
echo"<br>";
echo date_create($upload_date, new DateTimeZone($TimeZoneNameFrom))
->setTimezone(new DateTimeZone($TimeZoneNameTo))->format("Y-m-d H:i:s");
如果您只想根据用户的系统设置显示时间,那么只需将UTC时间值发送给客户端。取值范围为1970-01-01T00:00:00Z以来的毫秒。UNIX从同一纪元开始使用秒数,因此您只需要将UNIX UTC时间戳乘以1000:
var newLocalDate = new Date(UNIXutcTimeValue * 1000);
现在只需以用户可读的形式呈现它,例如使用Date.prototype.toLocaleString:
alert(newLocalDate.toLocaleString());
。2014-06-06T12:00:00Z是1402056000秒或1402056000000毫秒,所以在Safari中:
alert(new Date(1402056000000).toLocaleString()) // 6 June 2014 20:00:00 AWST
当然,你总是可以使用Date方法来格式化字符串。
回答你的问题:
在现代浏览器中,您可以使用
获取时区客户端var tz = Intl.DateTimeFormat().resolved.timeZone;
如果你的浏览器没有Intl (IE10和Safari),那就有点复杂了。我用moment.js做了一个小库:https://github.com/Canop/tzdetect.js
回答你的问题:
大多数时候你没有知道客户端的时区,你可以简单地让他的浏览器格式化你发送的UTC时间戳。请看RobG的回答。