Точное вычитание сотен минут с помощью Javascript

Если у меня есть два значения, каждое из которых представляет дату, например ГГГГММДДЧЧММ (YearMonthDayHourMinute), например:

202012141800
202012141614

Что я пытался передать в вопросе, так это то, что это дает мне 186 минут, но это не точно, однако, поскольку последние две цифры никогда не будут больше 59, учитывая 60 минут в часе. 100 в 186 приходятся на 18 часов (18:00) и 16 (16:00).

Как я могу вычесть их в Javascript, чтобы учесть дополнительные 40 минут, если две временные метки разнятся более чем на час?

У меня есть это, но это не так эффективно, так как мне нужно знать максимальное количество часов, в течение которых две временные метки могут быть разделены:

        var end_time = $('#the-agenda li.current time').data('end-time'),
            time_now = current_display_number,
            timer_duration = end_time - time_now;

        if (timer_duration > 200) {
            // if more than 2 hours, subtract 80 minutes
            timer_duration = timer_duration - 80;
        }
        else if (timer_duration > 100) {
            // if more than 1 hour, subtract 40 minutes
            timer_duration = timer_duration - 40;
        }

Я чувствую, что ответ каким-то образом может быть в ответе на этот вопрос, но я не уверен, как применить этот parseInt к этой ситуации.

Ну YYYYMMDDHHMM — это строковый формат. Никогда не относитесь к нему как к числу. Для арифметики даты сохраните их как правильные метки времени (например, минуты с начала эпохи). Если вы получаете строку в качестве входных данных, проанализируйте ее.

Bergi 14.12.2020 22:35

Отвечает ли это на ваш вопрос? Преобразование строки в дату в JavaScript

Heretic Monkey 15.12.2020 13:41

@Bergi, не могли бы вы расширить «Никогда не относитесь к этому как к числу». Используя решение, предоставленное pwilcox ниже, я смог заставить его работать, как и ожидалось. Однако мне пришлось сначала использовать .toString(), чтобы преобразовать то, что у меня есть, в строку.

Nathan 15.12.2020 15:28

@ Натан Это jQuery, который вы используете для получения end_time? Это проблема. (Тем не менее, преобразование его обратно в строку, прежде чем что-либо с ним делать, должно работать).

Bergi 15.12.2020 15:32

Да, @Bergi, это jQuery. Предоставленная вами ссылка действительно предоставила дополнительную информацию, которая меня интересовала. Спасибо!

Nathan 15.12.2020 19:29
Поведение ключевого слова "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) для оценки ваших знаний,...
0
5
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

// Different in milliseconds
const difference = (new Date('2020-12-14T18:00:00')) - (new Date('2020-12-14T16:14:00'));

const inMinutes = Math.floor(difference / 60000);

Вам нужно преобразовать строковые форматы в объект даты, чтобы получить точную информацию о дате.

Вопрос ОП указывает, что его строки имеют формат «ГГГГММДДЧЧММ». Этот ответ не соответствует его потребностям.

pwilcox 14.12.2020 23:16

OP сказал «например», а также не указал формат даты в своем примере кода.

James Hamann 14.12.2020 23:18
Ответ принят как подходящий

Вы бы не использовали parseInt. Вы бы использовали Date.parse, за исключением того, что строка должна быть в заранее определенном формате. Без использования специализированной библиотеки вам придется самостоятельно разбирать части, а затем создавать новую дату с частями. К счастью, входящие строки кажутся простыми для анализа. Сделайте что-то вроде этого:

let startTimeStr = '202012141614';
let endTimeStr = '202012141800';

let asDateTime = (d) => new Date(
  d.substring(0,4), 
  d.substring(4,6) - 1, 
  d.substring(6,8),
  d.substring(8,10),
  d.substring(10,12)
)

let startTime = asDateTime(startTimeStr);
let endTime = asDateTime(endTimeStr);

let result = (endTime - startTime) / 60000;

console.info(result);

Отлично, спасибо за это. Для всех, кто может использовать это и столкнуться с какими-либо проблемами, я получал d.substring error: “is not a function” в консоли. Это произошло потому, что когда я передал свою переменную в startTimeStr, это было число, поэтому использование startTimeStr = my_var.toString() решило эту проблему.

Nathan 15.12.2020 15:30

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