46

我正在尝试使用 JavaScript 计算两次之间的差异。JSON.stringify()这只是基本的数学,但我在使用and时似乎遇到了一些问题JSON.parse()

如果您想知道为什么我将JSON.stringify()函数应用于日期,那是因为我使用本地存储在客户端存储一些数据并在客户端再次登陆我的网站时使用它(这样更快而不是发出更多请求到服务器)。该数据通常会不时更新(我通过 API 从另一个网站获取数据),因此我设置了一个data_update变量并将其与其他数据一起存储。

这样我就可以从本地存储中获取存储的数据,并检查data_update(日期/时间)和检查时的时间/日期之间的差异,看看它是否大于一周/天/etc。

这就是我使用 JSON 函数的原因。我的问题是,当我从本地存储解析数据时,日期似乎与Date()对象不同。

我正在尝试按说执行下一个操作:

var x = JSON.parse(JSON.stringify(new Date()));

var y = JSON.parse(this.get_local_storage_data(this.data_cache_key)); // the data object stored on local storage

var q = y.data_update; // this is the variable where the Date() was stored

console.log(Math.floor((x-q)/1000));

以上将返回null。此外,当我想查看Math.floor(x)结果时,它会null再次返回。

那么在这种情况下我能做些什么呢?有解决办法吗?

4

3 回答 3

64

如果您查看 JSON.stringify 的日期输出,您会看到:

JSON.stringify(new Date())

结果是一个字符串。JSON 没有 Date 对象的原始表示,JSON.parse 将自动转换回 Date 对象。

Date 对象的构造函数可以采用日期字符串,因此您可以通过执行以下操作将这些字符串值转换回日期:

var x = new Date(JSON.parse(JSON.stringify(new Date())));

然后算术将起作用。

x = new Date(JSON.parse(JSON.stringify(new Date())))
y = new Date(JSON.parse(JSON.stringify(new Date())))
y - x
=> 982
于 2012-07-15T12:42:18.053 回答
27
JSON.stringify(new Date())

返回

“2013-10-06T15:32:18.605Z”

感谢上帝是:Date.prototype.toISOString()

于 2013-10-06T15:35:30.503 回答
0

正如推荐的答案所暗示的那样,日期只是在使用时转换为字符串JSON.stringify

可能适合此用例的另一种方法是以毫秒为单位存储时间,使用Date.now()

// Date.now() instead of new Date()
const millis = Date.now();

console.log(millis);

// same output as input
console.log(JSON.parse(JSON.stringify(millis)));

这样您就可以确保JSON.stringify在使用JSON.parse.

如果您有两个毫秒值,这也可以很容易地比较日期,使用<and >

另外,您可以随时将毫秒转换为日期(通常在将其呈现给用户之前):

const millis = Date.now();

console.log(millis);

console.log(new Date(millis));

注意:通常不建议使用毫秒作为日期表示,至少不在您的数据库中:https ://stackoverflow.com/a/48974248/10551293 。

于 2021-04-01T07:07:10.117 回答