从服务器我得到一个datetime变量的格式:6/29/2011 4:52:48 PM,它是UTC时间。我想使用JavaScript将其转换为当前用户的浏览器时区。

如何使用JavaScript或jQuery来做到这一点?


当前回答

在我看来,在一般情况下,服务器应该总是返回标准化ISO 8601格式的日期时间。

更多信息:

http://www.w3.org/TR/NOTE-datetime https://en.wikipedia.org/wiki/ISO_8601

在这种情况下,服务器将返回'2011-06-29T16:52:48.000Z',它将直接提供给JS Date对象。

var utcDate = '2011-06-29T16:52:48.000Z';  // ISO-8601 formatted date returned from server
var localDate = new Date(utcDate);

localDate将是正确的本地时间,在我的情况下将是两小时后(DK时间)。

您实际上不必进行所有这些只会使事情复杂化的解析,只要您与期望从服务器得到的格式一致即可。

其他回答

在Angular中,我这样使用Ben的回答:

$scope.convert = function (thedate) {
    var tempstr = thedate.toString();
    var newstr = tempstr.toString().replace(/GMT.*/g, "");
    newstr = newstr + " UTC";
    return new Date(newstr);
};

编辑:Angular 1.3.0添加了UTC日期过滤器,我还没有使用过,但它应该更简单,格式如下:

{{ date_expression | date : format : timezone}}

Angular 1.4.3 Date API

这对我来说很管用

选项1:如果日期格式是"yyyy-mm-dd"或"yyyy-mm-dd H:n:s",例如:"2021-12-16 06:07:40"

使用这种格式,它不知道它是本地格式还是UTC时间。既然我们知道日期是UTC,我们必须确保JS知道它是UTC。所以我们必须将日期设置为UTC。

        function setDateAsUTC(d) {
            let date = new Date(d);
            return new Date(
                Date.UTC(
                    date.getFullYear(),
                    date.getMonth(),
                    date.getDate(),
                    date.getHours(),
                    date.getMinutes(),
                    date.getSeconds()
                )
            );
        }

然后使用它


let d = "2021-12-16 06:07:40";
setDateAsUTC(d).toLocaleString();

// output: 12/16/2021, 6:07:40 AM

选项2:UTC日期格式为ISO-8601。大多数服务器的时间戳格式是ISO-8601 ex: '2011-06-29T16:52:48.000Z'。这样我们就可以把它传递给date函数和toLocaleString()函数。

let newDate = "2011-06-29T16:52:48.000Z"
new Date(newDate).toLocaleString();
//output: 6/29/2011, 4:52:48 PM

JSON日期字符串(在c#中序列化)看起来像“2015-10-13T18:58:17”。

在angular中,(遵循Hulvej)创建一个localdate过滤器:

myFilters.filter('localdate', function () {
    return function(input) {
        var date = new Date(input + '.000Z');
        return date;
    };
})

然后,像这样显示本地时间:

{{order.createDate | localdate | date : 'MMM d, y h:mm a' }}

把这个函数记在脑子里:

<script type="text/javascript">
function localize(t)
{
  var d=new Date(t+" UTC");
  document.write(d.toString());
}
</script>

然后为页面主体中的每个日期生成以下内容:

<script type="text/javascript">localize("6/29/2011 4:52:48 PM");</script>

删除GMT和时区,修改以下行:

document.write(d.toString().replace(/GMT.*/g,""));

在我看来,在一般情况下,服务器应该总是返回标准化ISO 8601格式的日期时间。

更多信息:

http://www.w3.org/TR/NOTE-datetime https://en.wikipedia.org/wiki/ISO_8601

在这种情况下,服务器将返回'2011-06-29T16:52:48.000Z',它将直接提供给JS Date对象。

var utcDate = '2011-06-29T16:52:48.000Z';  // ISO-8601 formatted date returned from server
var localDate = new Date(utcDate);

localDate将是正确的本地时间,在我的情况下将是两小时后(DK时间)。

您实际上不必进行所有这些只会使事情复杂化的解析,只要您与期望从服务器得到的格式一致即可。