console.log如何将javascript日期对象转换为人类可读的格式

console.log如何将javascript日期对象转换为人类可读的格式,javascript,date,overriding,v8,Javascript,Date,Overriding,V8,console.log({a:new Date()})的输出是{a:2019-05-19T11:30:57.514Z} JSON.stringify({a:new Date()})的值是{a:“2019-05-19T11:33:12.591Z”} 重写此项后:Date.prototype.toJSON=function(){返回this.tolocalString();} JSON.stringify({a:new Date()})的值是{a:“2019年5月19日,下午5:09:31”} 但是

console.log({a:new Date()})的输出是
{a:2019-05-19T11:30:57.514Z}

JSON.stringify({a:new Date()})的值是
{a:“2019-05-19T11:33:12.591Z”}

重写此项后:
Date.prototype.toJSON=function(){返回this.tolocalString();}

JSON.stringify({a:new Date()})的值是
{a:“2019年5月19日,下午5:09:31”}

但是
console.log({a:new Date()})的输出仍然是
{a:2019-05-19T11:41:31.256Z}

已尝试覆盖其他
日期。prototype
方法,如
toISOString()
toSource
toString
ToutString
valueOf
等。但没有任何帮助

无法理解v8 js引擎的本机源代码


是否有任何方法可以覆盖该行为以获得所需的结果?

这取决于控制台实现,它不在V8中,而是在主机中(Chrome、Chrome、Node.js等)

Node.js过去常常查找名为
inspect
(至少在v4中)的成员,并在该成员存在时使用该成员,但结果证明这是一个兼容性问题,它不再这样做了


我认为再也没有办法覆盖控制台对内置对象的呈现,尤其是在主机环境中。

在执行console.log()时,您没有将新日期()转换为json。你可以这样写

Date.prototype.toJSON = function(){ return this.toLocaleString(); }
console.log({a:JSON.stringify(new Date())})

控制台使用
toString
将日期(和其他对象)转换为字符串进行打印。因此,您可以覆盖
Date.prototype.toString
以更改打印内容。演示(从Chrome控制台会话粘贴副本):

var d=新日期() >控制台日志(d) <2019年5月19日星期日14:29:02 GMT+0200(中欧夏季时间) >Date.prototype.toString=Date.prototype.toLocalString <ƒtoLocaleString(){[本机代码]} >控制台日志(d) <2019年5月19日,下午2:29:02 >console.log({a:new Date()}) <{a:2019年5月19日,下午2:31:21}
另一个问题是
JSON.stringify({A:1})
给出
{A:1}
,而
console.log({A:1})
打印
{A:1}
(A
周围没有引号)。这与日期无关,这是因为JSON是JavaScript的一个非常有限的子集(
{a:1}
是有效的JavaScript,但不是有效的JSON)。此外,<代码>控制台。log 用于人类消费,不需要将输出解析为原始对象(S)——只需考虑<代码>控制台。日志(新数组(100))< /C> >:-/P>

编辑:上述内容适用于Chrome。由于ECMAScript规范没有涵盖
控制台
对象,因此每个嵌入式程序都可以提供他们认为有用的东西。Node.js
util.format
,它依次是
util.inspect
,它依次从
Date.prototype
开始执行
toISOString
函数,这意味着您无法覆盖它(这是一个功能,因为它意味着你不能打破它,或者是一个限制,因为它意味着你不能自定义它,这取决于你的观点).

问题的关键似乎在于覆盖
console.log
使用
Date
对象而不是字符串所做的事情。
json
不是
object
,在console中如何区分它们是一件好事。如果需要json表示,请使用
console.log(json.stringify(…)
您没有实际指定“期望的结果”是什么。您是正确的,但这仅适用于chrome。它在nodejs中不这样工作。“控制台使用
toString
…”不一定。在OP中,它似乎使用了toISOString或可能是JSON.stringify。控制台是一个主机对象,它的行为没有像ECMA-262这样的标准定义,因此它实际上可以以任何方式表示日期。是的,
控制台
没有指定。我添加了一段关于节点的内容(OP没有指定它关心的环境)。
> var d = new Date()
> console.log(d)
< Sun May 19 2019 14:29:02 GMT+0200 (Central European Summer Time)
> Date.prototype.toString = Date.prototype.toLocaleString
< ƒ toLocaleString() { [native code] }
> console.log(d)
< 5/19/2019, 2:29:02 PM
> console.log({a:new Date()})
< {a: 5/19/2019, 2:31:21 PM}