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

时间:2019-05-19 11:49:36

标签: javascript date override 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(){ return this.toLocaleString(); }

JSON.stringify({a:new Date()})的值为{"a":"5/19/2019, 5:09:31 PM"}

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

尝试覆盖其他Date.prototype方法,例如toISOString()toSourcetoStringtoUTCStringvalueOf等。但没有一个帮助。

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

有什么方法可以覆盖行为以获得期望的结果?

3 个答案:

答案 0 :(得分:2)

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

Node.js曾经寻找一个名为inspect的成员(至少在v4中返回),并且使用它(如果存在的话),但事实证明这是一个兼容性问题,并且不再适用

我认为不再有任何方法可以覆盖控制台的内置对象呈现,尤其是在主机环境中更是如此。

答案 1 :(得分:0)

在执行console.log()时,您没有将新的date()转换为json。您可以用这种方式编写。

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

答案 2 :(得分:0)

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

> 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}

一个单独的问题是JSON.stringify({a: 1})给出{"a":1},而console.log({a: 1})打印{a: 1}a周围没有引号)。这与日期无关,原因是JSON是JavaScript的一个非常有限的子集({a: 1}是有效的JavaScript,但不是有效的JSON)。另外,console.log供人类食用,不要求可以将输出解析回原始对象,只需考虑console.log(new Array(100))的作用:-)


编辑:以上内容适用于Chrome。由于console对象未包含在ECMAScript规范中,因此每个嵌入器都可以提供他们认为有用的任何内容。 Node.js uses util.format,后者依次为uses util.inspect,后者依次为getsprimordial toISOString函数Date.prototype,这意味着您无法覆盖它(这是一项功能,因为它意味着您无法破坏它;或者是一项限制,因为它意味着您无法自定义它,具体取决于您的观点)。