Javascript Date toJSON()输出错误的日期

时间:2016-08-26 01:49:13

标签: javascript date date-formatting

我的总部设在澳大利亚,而new Date()则告诉我目前在澳大利亚的日期和时间 Fri Aug 26 2016 09:16:16 GMT+1000 (AUS Eastern Standard Time) ,如果我写new Date().toJSON() 我得到2016-08-25T23:20:08.242Z, 我如何获得与yyyy-mm-ddThh:mn:ss相同的格式,但保留当地的日期和时间,即它应该是26而不是25日。

修改:当我使用new Date(2016, 11, x)以编程方式var x = 31编写时,使用toJSON()我无法保证因为时区而看到显示2016-12-31,所以我想知道是否有不同的javascript函数会给我预期的结果。

3 个答案:

答案 0 :(得分:1)

我会使用moment.js。

var date = moment("Fri Aug 26 2016 09:16:16 GMT+1000");
console.log(moment(date).format('YYYY-MM-DD T hh:mm:ss'));

https://jsfiddle.net/Refatrafi/ys4nu8o9/

答案 1 :(得分:0)

toJSON()ISO 8601格式返回时间戳。字符串末尾的Z表示使用了UTC。 ECMAScript中的日期对象是内部UTC。 Date.prototype.toJSON的规范说它使用Date.prototype.toISOString,它声明"时区总是UTC"。

答案 2 :(得分:0)

日期没错,是UTC。没有时区信息,yyyy-mm-ddThh:mn:ss没有意义,除非你明确地想要假设它在AEST时区。

如果您要将日期作为字符串传输回某种类似Date的某种类型的对象(例如,您的网络服务器),那么您无需做任何事情。 2016-08-25T23:20:08.242Z无论你用什么来解析它,都明确指出了同一个时间点。

如果您正在尝试格式化日期对象并将其显示在某处,则可以提取Date对象的不同部分并构建所需的表示形式:

function format_date(d) {
    var pretty_date = [d.getFullYear(), d.getMonth() + 1, d.getDate()].join('-');
    var pretty_time = [d.getHours(), d.getMinutes(), d.getSeconds()].join(':');

    return pretty_date + 'T' + pretty_time;
}

正如其他答案所指出的那样,如果您计划更多地使用日期,请考虑使用更容易的库。 JavaScript没有非常丰富的API,因此您必须编写更多代码。