momentjs получает разницу во времени

#javascript #angular #momentjs

#javascript #угловой #momentjs

Вопрос:

Я пытаюсь получить время, которое пользователь провел на странице с moment.js но он возвращает неправильное значение.

Код:

 dateStart: any;

ngOnInit() {
  this.dateStart = moment(); // current time
}

// when user post data before being redirect
moment(moment(this.dateStart).diff(moment())).format("hh:mm:ss");
  

Приведенный выше код должен возвращать, например 00:00:04 , что означает, что пользователь был на этой странице для 4 seconds . но я получил что-то вроде этого 06:59:55

Есть идеи?

Комментарии:

1. Я подозреваю, что вы форматируете дату, которая составляет 4 секунды до 1 января 1970 года, с поправкой на смещение вашего часового пояса. Вы ищете интервал, а не дату.

2. @rayhatfield как вы думаете, что я должен делать?

Ответ №1:

если вам просто нужно количество секунд (diff), почему бы не использовать функцию diff momentjs с аргументами измерений (поддерживаемые — years , months , weeks , days , hours , minutes , а seconds по умолчанию — миллисекунды.)

 var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') // 1
  

 let dateStart = moment([2020, 9, 2, 12, 0, 0, 125]);


let futureTime = moment(); 

let secondsAgo = (futureTime.diff(dateStart, 'seconds') % 60);
let minutesAgo = (futureTime.diff(dateStart, 'minutes') % 60);
let hoursAgo = futureTime.diff(dateStart, 'hours');
console.log('hour: '   hoursAgo   ', minute: '   minutesAgo   ', seconds: '   secondsAgo)
let hms = moment({
  hour: hoursAgo,
  minute: minutesAgo,
  seconds: secondsAgo
});
console.log(hms.format('HH:mm:ss'));  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.0/moment.min.js"></script>  

Комментарии:

1. мне нужны не просто секунды, мне нужны часы, минуты и секунды

2. Я обновил код, чтобы показать разницу в формате HH: mm: ss

Ответ №2:

Я подозреваю, что вы форматируете дату, которая составляет 4 секунды до 1 января 1970 года, с поправкой на смещение вашего часового пояса. Вы ищете продолжительность, а не дату.

Зачем вообще его форматировать? Почему бы просто не записать необработанную продолжительность? Вам не нужен момент, чтобы вычесть одну временную метку из другой. Date.now() получит текущую временную метку:

 this.startDate = Date.now();

// ...a few moments later...

const duration = Date.now() - this.startDate; // number of ms between then and now
  

Комментарии:

1. 1 Если я использую moment.duration(this.dateStart) это PT444891H22M42.093S 2 Why not just record the raw duration? , пожалуйста, покажите мне, как? Я открыт для всех решений, если они дают мне то, что я ищу

2. это возвращает 3848 idk, что это значит: D

3. Это означает 3848 миллисекунд между началом и концом, или 3,848 секунды.

4. Конечно. Разделите на 1000, чтобы получить секунды, разделите секунды на 60, чтобы получить минуты и т.д., Или используйте один из многих существующих пакетов, которые делают это, например, hh-mm-ss .

5. не удалось этого сделать :/

Ответ №3:

Сначала вы можете попробовать преобразовать в UTC.

 moment.utc(moment().diff(this.dateStart)).format("HH:mm:ss.SSS"); //include milliseconds
  

 let start = moment();

setTimeout(() => {
  const duration = moment.utc(moment().diff(start));
  console.log(duration.format("HH:mm:ss.SSS"));
}, 1500);  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.0/moment.min.js"></script>  

Комментарии:

1. как я могу изменить часовой пояс utc ?

2. посмотрите на код, который я вам только что дал, это небольшое изменение в вашем коде

3. Я бы хотел, чтобы ваш подход был чистым с минимальными требованиями к кодам, но я действительно не хочу использовать utc() , есть ли какой-нибудь способ, которым вы можете показать мне, как использовать мой local вместо utc?

4. ну, это не имеет значения, что вы используете. Вы не имеете в виду время локали, вам просто нужно, чтобы оно отображалось в удобочитаемой форме.

Ответ №4:

В plotly.js который возвращает разницу в виде нового объекта plotly. Я думаю, что единственный способ сделать это — получить разницу во времени в секундах, а затем рассчитать минуты и часы.

Должно сработать следующее. Он возвращает разницу во времени как String . Таким образом, секунды и минуты всегда находятся в диапазоне от 0 до 60, а часы больше 0. Результат 74:12:40 будет означать, что пользователь провел на этой странице 74 часа, 12 минут и 40 секунд.

 function runTest() {
    let startDate = moment('02.10.2020 8:00:00', 'DD.MM.YYYY HH:mm:ss');
    let endDate = moment('03.10.2020 10:24:38', 'DD.MM.YYYY HH:mm:ss');
    getDifferenceTime(startDate, endDate);
}


function getDifferenceTime(startDate, endDate) {
    // Get time difference in seconds
    let seconds = endDate.diff(startDate, 'seconds');
    let minutes = 0;
    let hours = 0;
    // Calculate number of minutes
    if (seconds >= 60) {
        minutes = Math.floor(seconds / 60);
        seconds -= minutes * 60;
    }
    // Calculate number of hours
    if (minutes >= 60) {
        hours = Math.floor(minutes / 60);
        minutes -= hours * 60;
    }
    let timeString = hours   ':'   minutes   ':'   seconds;
    console.log(timeString);
    return timeString;
}
  

Вы можете протестировать это с помощью приведенного выше кода. Он должен вернуться 26:24:38 , что является вашим ожидаемым результатом.