Вопрос касательно функции даты в javascript - PullRequest
0 голосов
/ 02 мая 2019

Я делаю функцию для пересчета времени на основе текущего времени. timeShowToday - это определенное время каждый день (устанавливается в 8:00 вечера), чтобы показать какой-то слепой ответ.

_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: темп: пт 3 мая 2019 20:00:00 GMT + 0900
05-03 00: 26: 59.623 ReactNativeJS: timeShowYesterday: сб. 04 мая 2019 20:00:00 GMT + 0900

Как вы можете видеть, temp правильно записывает текущее время, но timeShowYesterday имеет +1 день. Я понятия не имею, почему это так, потому что все, что я сделал, это просто назначил временную шкалу timeShowYesterday.

я что-то упустил? Спасибо

Ответы [ 3 ]

2 голосов
/ 02 мая 2019

Помните, что 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);

Во избежаниеперезаписывая ваш рефенс, просто создайте новую дату и обновите ее.

2 голосов
/ 02 мая 2019

Вы, похоже, предполагаете, что setDate создает новую дату без изменения исходной даты. Это не. Вместо этого он просто изменяет объект даты и возвращает собственную ссылку.

Использование это то, что это:

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

можно записать более элегантно, как:

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

Если вы хотите создать две независимые даты, вам нужно скопировать дату :

  const copy = new Date(oldDate);
0 голосов
/ 02 мая 2019

Нашел проблему!

Я думал, что setDate

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

создаст новый экземпляр из timeShowYesterday, не затрагивая его, и назначит его timeShowToday, но фактически изменил его.

Так что +1 была проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...