Как получить разницу в часах между сегодня и следующей пятницей

Я хочу получить разницу в часах между 18:00 и следующей пятницей (выходные), используя momentjs, я пробовал это, но это не работает:

public getWeekend() {
    const nextFriday = moment().weekday(4)
    nextFriday.hours(18) // Weekend time: 18:00
    nextFriday.minutes(0)
    nextFriday.seconds(0)

    const diff = moment(nextFriday.diff(moment()))
    console.info(diff.days())
    if (diff.days() * 24 + diff.hours() <= 99) {
      return nextFriday.toString()
    } else {
      return 0
    }
  }
}

console.info(diff.days()) печатает 6 дней, тогда как сейчас среда

Проверьте мой обновленный ответ.

Artem Arkhipov 29.05.2019 11:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
98
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

ОБНОВЛЕНО , теперь это совершенно правильно.

Во-первых, пятница на самом деле имеет порядковый номер 5, поэтому используйте его вместо 4. const nextFriday = moment().weekday(5) - это правильная пятница.

Следующим важным моментом является то, что ближайший Friday берется по умолчанию, это означает, что можно выбрать уже прошедшую пятницу (например, если сегодня суббота). В таком случае нам просто нужно добавить одну неделю.

Вот рабочий фрагмент кода:

function getWeekend() {
    const today = moment();
    const friday = moment().weekday(5);
    // check if wee need to add one week in case of previous Friday selected
    if (friday < today) { 
        friday.add(1, 'weeks');
    }
    friday.hours(18) // Weekend time: 18:00
    friday.minutes(0)
    friday.seconds(0)
    return friday.diff(moment(), 'hours');
}

const hoursToFriday = getWeekend();
console.info(`Friday 18:00 will be in ${hoursToFriday} hours`);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>

Это неправильно, потому что, если вы запустите этот код в СУББОТУ, он не даст вам СЛЕДУЮЩУЮ пятницу, он даст вам предыдущую пятницу.

TKoL 29.05.2019 11:10

Я пробовал. Вот почему я так сказал.

TKoL 29.05.2019 11:12

На данный момент для меня выход составляет 53 часа, и это правильное количество часов до следующей пятницы.

Artem Arkhipov 29.05.2019 11:13

Я не думаю, что вы понимаете, что я сказал. Я сказал, что если вы запустите этот код в субботу, он даст вам неверный результат. Это дает вам правильный результат сегодня, потому что сегодня не суббота.

TKoL 29.05.2019 11:14

Теперь я понял. Извините за это, вы правы в этом случае. Собираюсь изменить свой ответ....

Artem Arkhipov 29.05.2019 11:16

Только что обновил ответ. Теперь он работает правильно. Спасибо @TKoL

Artem Arkhipov 29.05.2019 11:19

Я рекомендовал использовать moment

const diff = moment.duration(nextFriday.diff(moment()))
const deepDiff = diff.format("D [day], H [hour and] m [min]")

https://jsfiddle.net/7ehoq06n/

Если вы просто позвоните moment().weekday(5), он перейдет на пятницу «этой недели», а это значит, что если вы в субботу, он перейдет на ВЧЕРА.

Если вы хотите следующую пятницу, всегда в будущем, используйте это:

var today = moment();
var friday = moment().weekday(5);
if (friday < today) {
    friday.add(1, 'weeks');
}

Moment.js имеет встроенную функцию .fromNow(), которая возвращает время между заданным временем и местным временем. Таким образом, вам нужно изменить только 2 строки: .weekday(4), потому что пятница — это день недели (5). и вызовите функцию .fromnow().

console.info(getWeekend());
function getWeekend() {
    const nextFriday = moment().weekday(5);
    nextFriday.hours(18); // Weekend time: 18:00
    nextFriday.minutes(0);
    nextFriday.seconds(0);
    return nextFriday.fromNow();
}
<script src = "https://momentjs.com/downloads/moment.min.js"></script>

Обратите внимание, что fromNow вернет строку. Moment.js имеет для этого встроенное решение.

Ответ принят как подходящий

попробуй это:

function getWeekend() {

    const nextFriday = moment().weekday(4)
        nextFriday.hours(18) // Weekend time: 18:00
        nextFriday.minutes(0)
        nextFriday.seconds(0)

        const diffHours = moment.duration(nextFriday.diff(moment())).asHours()
        console.info(`${diffHours} hours`) // 31.7 hours
        if (diffHours <= 99) {
          return nextFriday.toString()
        } else {
          return 0
        }
      }

Вы можете измерить разницу в часах, используя метод (now - next Friday) / 60*60*1000. Попробуйте:

const nextFriday = moment().day(5)
var hours = Math.abs(new Date() - nextFriday) / 36e5; 
console.info(hours);

Примечание: 36e5 — это научное обозначение 60*60*1000.

Ваш способ расчета следующей пятницы не работает в субботу, см. комментарии к ответу Артема Архипова.

TKoL 29.05.2019 11:40

Другие вопросы по теме