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:减去日期有效,添加日期无效的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 从日期开始减去增加1个月 [重复]

在 JavaScript 中检测“无效日期”日期实例

从日期中添加或减去天数时如何避免周末或节假日[重复]

在Javascript中也减去日期减去月份[重复]

VB 当前日期 减去 一个月

如何有效地从python中的日期中减去年份?