Если у меня есть два значения, каждое из которых представляет дату, например ГГГГММДДЧЧММ (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 к этой ситуации.
Отвечает ли это на ваш вопрос? Преобразование строки в дату в JavaScript
@Bergi, не могли бы вы расширить «Никогда не относитесь к этому как к числу». Используя решение, предоставленное pwilcox ниже, я смог заставить его работать, как и ожидалось. Однако мне пришлось сначала использовать .toString(), чтобы преобразовать то, что у меня есть, в строку.
@ Натан Это jQuery, который вы используете для получения end_time
? Это проблема. (Тем не менее, преобразование его обратно в строку, прежде чем что-либо с ним делать, должно работать).
Да, @Bergi, это jQuery. Предоставленная вами ссылка действительно предоставила дополнительную информацию, которая меня интересовала. Спасибо!
// 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);
Вам нужно преобразовать строковые форматы в объект даты, чтобы получить точную информацию о дате.
Вопрос ОП указывает, что его строки имеют формат «ГГГГММДДЧЧММ». Этот ответ не соответствует его потребностям.
OP сказал «например», а также не указал формат даты в своем примере кода.
Вы бы не использовали 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()
решило эту проблему.
Ну
YYYYMMDDHHMM
— это строковый формат. Никогда не относитесь к нему как к числу. Для арифметики даты сохраните их как правильные метки времени (например, минуты с начала эпохи). Если вы получаете строку в качестве входных данных, проанализируйте ее.