获取web用户's时区作为字符串


Get the web User's timezone as string

我正在制作一个网站,用户将在其中上传问题和答案。现在我需要获得用户的时区,我可以将其存储在变量$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的回答。