将 JSON 日期时间转换为 JavaScript 日期时,它显示为比本地时区早 1 天

When converting a JSON DateTime to a JavaScript date it is showing as 1 day previous than the local timezone

本文关键字:日期 时区 显示 时间 JSON 转换 JavaScript      更新时间:2023-09-26

我正在发出如下所示的 AJAX 请求:

$.ajax({
    type: 'POST',
    url: '@Url.Action("GetExpirationDates", "Products")',
    data: data,
    dataType: 'json',
    success: function (data) {
    var dateArray = data.map(function (date) {
        var d = new Date(date);
        return d.toLocaleDateString();
    });
});

以下是data的样子:

2016-02-25T00:00:00,2016-03-25T00:00:00

,2016-04-25T00:00:00

似乎只要我这样做new Date(date)这些日期中的每一个都有机会显示为

2/24/2016, 3/24/2016, 4/24/2016

(比应有的少一天)取决于当地时间。我知道这很可能是由于 JavaScript 处理时区的方式。我想知道如何修复它。

这取决于您希望如何使用最终结果。一个简单的例子是:

var d = new Date("2016-02-25T00:00:00");
d.getDate(); //returns 24 because my timezone is -06:00.
d.getUTCDate(); //returns 25, the UTC day of the month

对于getMonth/getUTCMonth也可以这样做。

我真的建议使用时刻。哪里像

moment("2016-02-25T00:00:00").format("MM/DD/YYYY"); //returns "02/25/2016"

它使您可以更好地控制 UTC 和格式化字符串。

试一试:

function getNow() {
    var date = new Date(),
        y = date.getFullYear(),
        mo = date.getMonth() + 1,
        d  = date.getDate(),
        h = date.getHours(),
        m  = date.getMinutes(),
        s  = date.getSeconds();
    date.setDate(date.getDate());
    mo = (mo < 10 ? '0' : '') +  mo;
    d = (d < 10 ? '0' : '') + d;
    h = (h < 10 ? '0' : '') + h;
    m = (m < 10 ? '0' : '') + m;
    s = (s < 10 ? '0' : '') + s;
    return h + ':' + m + ':' + s + ' - ' + mo + '/' + d + '/' + y;
}
如果在

使用ISO8601日期字符串时未指定 UTC 偏移量,浏览器将假定日期为 UTC。

将其表示为区域设置日期字符串将根据您的时区应用偏移量。

如果要获取 UTC 日期,可以使用

return d.toUTCString();

或者,如果您可以控制 JSON 服务,则可以在 ISO 字符串中指定日期所属的时区。

例如,UTC - 7 小时将表示为。

2016-02-25T00:00:00-0700,2016-03-25T00:00:00-0700

,2016-04-25T00:00:00-0700

如果您的本地时区是 UTC - 7 小时,d.toLocaleString 将正确显示为

2/25/2016, 3/25/2016, 4/25/2016