【问题标题】:getYear() in JavaScript returns 118 [duplicate]JavaScript 中的 getYear() 返回 118 [重复]
【发布时间】:2018-07-04 18:17:50
【问题描述】:

我需要计算最后一个周末之前的最后一个星期一的日期。使用了我认为最常见的 Stack Overflow 建议后,我得到了以下代码:

const getDayOfTheWeek = () => {
  let date = new Date();
  let clonedDate = new Date(date.getTime());
  console.log(clonedDate);
  const dow = clonedDate.getDay();
  console.log(dow);
  const offset = dow+6;
  console.log(offset);
  const newDate = new Date(clonedDate.setDate(clonedDate.getDate() - offset));
    console.log(newDate);
  const newNewDate = new Date(newDate.getTime());
  console.log(newNewDate);
  const day = newNewDate.getDate();
  const month = newNewDate.getMonth();
  const year = newNewDate.getYear();

  console.log('the year is ',year, 'the month is ', month);
}
getDayOfTheWeek();

它返回 118 的年份和 5 的月份,这不是我需要的那个星期一。另一方面,newNewDate 是最后一个星期一。我想知道是什么原因造成的。我知道有太多不需要的重新分配。请帮忙。

【问题讨论】:

  • 为什么需要复制日期?在创建clonedDate 之后,您没有使用date,在创建newDate 之后,您也没有使用clonedDate,在创建newNewDate 之后,您也没有使用newDate。但无论如何,调用new Date 总是会创建一个新的日期对象,所以可以肯定的是,这会“克隆”日期(使用术语“深度”克隆没有意义,因为日期不包含其他值)。
  • 它似乎可以解释 118 年。
  • 一点也不:new Date().getYear() // 118。这就是getYear 的工作原理:“对于大于或等于 2000 的年份,getYear() 返回的值是 100 或更大。例如,如果年份是 2026,则 getYear() 返回 126。” i> developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 你应该改用getFullYear()
  • 还有 5 个月?

标签: javascript date


【解决方案1】:

无论您做什么都是完美的,唯一的错误是您使用 getMonth()getYear() 并误解了它们。

date.getMonth() 为您提供从 0 到 11 的月份。所以 5 实际上是六月月。

date.getYear() 这个方法返回年份减去 1900,所以实际是 118+1900=2018,而不是你可以使用 date.getFullYear() 这将2018年回归

另外,您不需要这么多步骤。

该功能可以简单地用 newDate 停止,如下所示

const getDayOfTheWeek = () => {
  let date = new Date();
  let clonedDate = new Date(date.getTime());
  console.log(clonedDate);
  const dow = clonedDate.getDay();
  console.log(dow);
  const offset = dow+6;
  console.log(offset);
  const newDate = new Date(clonedDate.setDate(clonedDate.getDate() - offset));
    console.log(newDate);
  const day = newDate.getDate();
  const month = newDate.getMonth() + 1;
  const year = newDate.getFullYear();

  console.log('the year is ',year, 'the month is ', month);
}
getDayOfTheWeek();

这将给出“年份是 2018 月份是 6”

希望这会有所帮助。

【讨论】:

  • clonedDatenewDate 也不需要。
  • @FelixKling 我认为为了安全起见将需要 clonedDate,我不知道 JS 使用的最小刻度是多少,但如果再次调用 Date() 构造函数来创建一个新日期,并假设那个时间是日期变化的时间,我的意思是如果 t1 = new Date() 是今天 & t2 = new Date() 下一个语句是明天。
  • 问题是你指出的不是深度复制,但我没有检查 getYear() 返回的内容!我太自信了,我以前用过它,而且效果很好。谢谢大家的帮助。
  • 我是说没有必要创建第二个(或第三个)日期对象。一切都可以通过date 完成。 jsfiddle.net/m1py98vx/1
  • @FelixKling 是的,我只专注于一个部分,所以跳过了优化。那个小提琴是完美的。
猜你喜欢
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多