Javascript:减去日期有效,添加日期无效
Posted
技术标签:
【中文标题】Javascript:减去日期有效,添加日期无效【英文标题】:Javascript: Substracting dates works and adding them does not work 【发布时间】:2022-01-23 18:59:10 【问题描述】:此代码减去日期:
const moment = require("moment");
const currentDate = new Date();
// #NOTE:
// By midnight, I mean at the end of the current day
const day_to_add = +1 * 24 * 60 * 60 * 1000;
const current_day_at_midnight_date = new Date(
currentDate.setHours(0, 0, 0, 0) + day_to_add
);
const twenty_eight_days_to_remove = 27 * 24 * 60 * 60 * 1000;
const twenty_eight_days_ago_date = new Date(
currentDate - twenty_eight_days_to_remove
);
const formatted_first_day = moment(current_day_at_midnight_date).format(
"YYYY-MM-D"
);
const formatted_last_day = moment(twenty_eight_days_ago_date).format(
"YYYY-MM-D"
);
console.log(
"???? ~ file: add_remove_date.js ~ line 17 ~ formatted_first_day",
formatted_first_day
);
console.log(
"???? ~ file: add_remove_date.js ~ line 21 ~ formatted_last_day",
formatted_last_day
);
这是结果:
???? ~ 文件:add_remove_date.js ~ 第 17 行 ~ formatted_first_day 2021-12-23
???? ~ 文件:add_remove_date.js ~ 第 21 行 ~ formatted_last_day 2021-11-25
如您所见,它按预期减去了 28 天。
此代码添加日期:
const moment = require("moment");
const currentDate = new Date();
// #NOTE:
// By midnight, I mean at the end of the current day
const day_to_add = +1 * 24 * 60 * 60 * 1000;
const current_day_at_midnight_date = new Date(
currentDate.setHours(0, 0, 0, 0) + day_to_add
);
const twenty_eight_days_to_add = 27 * 24 * 60 * 60 * 1000;
const twenty_eight_days_later_date = new Date(
currentDate + twenty_eight_days_to_add
);
const formatted_first_day = moment(current_day_at_midnight_date).format(
"YYYY-MM-D"
);
const formatted_last_day = moment(twenty_eight_days_later_date).format(
"YYYY-MM-D"
);
console.log(
"???? ~ file: add_remove_date.js ~ line 17 ~ formatted_first_day",
formatted_first_day
);
console.log(
"???? ~ file: add_remove_date.js ~ line 21 ~ formatted_last_day",
formatted_last_day
);
这基本上是相同的代码。我刚刚将 - 替换为 +。 但是,它不起作用。结果如下:
???? ~ 文件:add_remove_date.js ~ 第 17 行 ~ formatted_first_day 2021-12-23
???? ~ 文件:add_remove_date.js ~ 第 21 行 ~ formatted_last_day 2021-12-22
由于某种奇怪的原因,加法的结果formatted_last_day
总是比formatted_first_day
早一天。
知道这里发生了什么吗?
【问题讨论】:
为什么只使用momentjs进行格式化? o.O 【参考方案1】:日期是对象。如果您对它们使用运算符,它们将被强制转换为运算符支持的其他类型。在 javascript 中,字符串是这里的首选,然后是数字,所以...
+
=> 强制转换为字符串
-
=> 强制转换为数字(字符串不支持-
)
所以,date + 1
等价于date.toString() + 1
,但date - 1
等价于date.valueOf() - 1
。
您可能希望在这两种情况下都将时间戳记为数字,您可以通过手动调用.valueOf()
(date.valueOf() + something
) 或使用也仅适用于数字的一元加号 (+date + something
) 来实现。
正如评论者 Andreas 指出的那样:虽然这是对特定问题和误解的答案,但总体上更好的方法是使用 moment
的函数,因为无论如何您已经使用了该库:@ 987654332@ 表示明天 0:00 和 moment().add(28, "d")
表示 4 周内的同一时间。
【讨论】:
“你可能想要”对所有事情都使用 momentjs:moment().add(1, "d").startOf("day")
, moment().add(28, "d")
以上是关于Javascript:减去日期有效,添加日期无效的主要内容,如果未能解决你的问题,请参考以下文章