#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, что это значит: D3. Это означает 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
, что является вашим ожидаемым результатом.