为了账号安全,请及时绑定邮箱和手机立即绑定

关于JavaScript中的日期函数的问题

关于JavaScript中的日期函数的问题

慕标5832272 2021-05-05 14:21:06
我正在制作一个用于根据当前时间重新计算时间的函数。timeShowToday是每天的特定时间(设置为8:00 pm),以显示一些盲目的答案。_checkTime = () => {    let timeNow = new Date();    let timeShowToday = new Date(   //set at 8:00pm everyday      timeNow.getFullYear(),      timeNow.getMonth(),      timeNow.getDate(),      20,      0    );    let timeShowYesterday = timeShowToday.setDate(timeShowToday.getDate() - 1);    let timeDiff = timeShowToday.getTime() - timeNow.getTime();    if (timeDiff < 0) {  //recalculate if current Time is past specific time(8:00pm)       let temp = new Date(        timeNow.getFullYear(),        timeNow.getMonth(),        timeNow.getDate(),        20,        0      );      console.log(temp);      timeShowYesterday = temp;      timeShowToday = timeShowYesterday.setDate(        timeShowYesterday.getDate() + 1      );      console.log(timeShowYesterday);    }这里的问题是,尽管我刚刚将temp分配给timeShowYesterday,但变量temp和timeShowYesterday的日期时间却不同。这是在我进行控制台日志时得到的日志:05-03 00:26:59.623 ReactNativeJS:temp:星期五五月03 2019 20:00:00 GMT + 090005-03 00:26:59.623 ReactNativeJS:timeShowYesterday:星期六五月04 2019 20:00:00 GMT + 0900如您所见,temp正确记录了当前时间,但是timeShowYesterday具有+1天。我不知道为什么会这样,因为我所做的只是将temp分配给timeShowYesterday。我错过了什么吗?谢谢
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

您似乎假设在setDate不更改原始日期的情况下创建了一个新日期。它不是。相反,它只是修改日期对象并返回一个自引用。

的用法是这样的:

  date.setDate(10);
  date.setMinutes(10);

可以更优雅地写成:

  date.setDate(10).setMinutes(10);

如果要创建两个独立的日期,则必须复制日期

  const copy = new Date(oldDate);


查看完整回答
反对 回复 2021-05-20
?
月关宝盒

TA贡献1772条经验 获得超5个赞

请注意setDate会修改您的引用,而不会创建新引用。


    let timeNow = new Date();

    let timeShowToday = new Date(   //set at 8:00pm everyday

      timeNow.getFullYear(),

      timeNow.getMonth(),

      timeNow.getDate(),

      20,

      0

    );        

      

    let timeShowYesterday = new Date(timeShowToday);

    timeShowYesterday.setDate(timeShowYesterday.getDate() - 1);

    

    

    console.log('Yesterday', timeShowYesterday);

    console.log('Today', timeShowToday);

    

    let timeDiff = timeShowToday.getTime() - timeNow.getTime();


    if (timeDiff < 0) {  //recalculate if current Time is past specific time(8:00pm) 

      const timeShowYesterday = new Date(

        timeNow.getFullYear(),

        timeNow.getMonth(),

        timeNow.getDate(),

        20,

        0

      );

      

      timeShowToday = new Date(timeShowYesterday);

      timeShowToday.setDate(timeShowToday.getDate() + 1);

      

       console.log('Yesterday', timeShowYesterday);

       console.log('Today', timeShowToday);

    }

我更新了

let timeShowYesterday = new Date(timeShowToday); 

 timeShowYesterday.setDate(timeShowYesterday.getDate() - 1);

timeShowToday = new Date(timeShowYesterday); 

 timeShowToday.setDate(timeShowToday.getDate() + 1);

为避免覆盖您的参考,只需创建一个新日期并进行更新即可。


查看完整回答
反对 回复 2021-05-20
?
12345678_0001

TA贡献1802条经验 获得超5个赞

发现了问题!

我以为setDate

 timeShowToday = timeShowYesterday.setDate(
        timeShowYesterday.getDate() + 1
      );

会从timeShowYesterday创建一个新实例,而不影响它,并将其分配给timeShowToday,但实际上对其进行了修改。

所以+1是问题所在。


查看完整回答
反对 回复 2021-05-20
  • 3 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信