Подтвердить что ты не робот

Javascript возвращает количество дней, часов, минут, секунд между двумя датами

Кто-нибудь может связать меня с каким-то учебником, где я могу узнать, как возвращать дни, часы, минуты, секунды в javascript между двумя временными интервалами unix?

У меня есть:

var date_now = unixtimestamp;
var date_future = unixtimestamp;

Я хотел бы вернуться (жить), сколько дней, часов, минут, секунд осталось от date_now до date_future.

4b9b3361

Ответ 1

Просто выясните разницу в секундах (не забывайте, что временные метки JS фактически измеряются в миллисекундах) и разложите это значение:

// get total seconds between the times
var delta = Math.abs(date_future - date_now) / 1000;

// calculate (and subtract) whole days
var days = Math.floor(delta / 86400);
delta -= days * 86400;

// calculate (and subtract) whole hours
var hours = Math.floor(delta / 3600) % 24;
delta -= hours * 3600;

// calculate (and subtract) whole minutes
var minutes = Math.floor(delta / 60) % 60;
delta -= minutes * 60;

// what left is seconds
var seconds = delta % 60;  // in theory the modulus is not required

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

Ответ 2

Здесь, в javascript: (Например, будущая дата - Новый год)

DEMO (обновляется каждую секунду)

var dateFuture = new Date(new Date().getFullYear() +1, 0, 1);
var dateNow = new Date();

var seconds = Math.floor((dateFuture - (dateNow))/1000);
var minutes = Math.floor(seconds/60);
var hours = Math.floor(minutes/60);
var days = Math.floor(hours/24);

hours = hours-(days*24);
minutes = minutes-(days*24*60)-(hours*60);
seconds = seconds-(days*24*60*60)-(hours*60*60)-(minutes*60);

Ответ 3

Я называю это "методом снеговика-карла" и считаю его более гибким, когда вам нужны дополнительные временные интервалы, такие как недели, месяцы, годы, столетия... и не нужно слишком много повторяющегося кода:

var d = Math.abs(date_future - date_now) / 1000;                           // delta
var r = {};                                                                // result
var s = {                                                                  // structure
    year: 31536000,
    month: 2592000,
    week: 604800, // uncomment row to ignore
    day: 86400,   // feel free to add your own row
    hour: 3600,
    minute: 60,
    second: 1
};

Object.keys(s).forEach(function(key){
    r[key] = Math.floor(d / s[key]);
    d -= r[key] * s[key];
});

// for example: {year:0,month:0,week:1,day:2,hour:34,minute:56,second:7}
console.log(r);

Есть FIDDLE/ES6 Version (2018)/TypeScript Version (2019)

Вдохновлен ответом Альнитак.

Ответ 4

Обратите внимание, что вычисление только на основе различий не распространяется на все случаи: високосные годы и переход на "летнее время".

Javascript имеет плохую встроенную библиотеку для работы с датами. Я предлагаю вам использовать стороннюю библиотеку javascript, например. MomentJS; вы можете увидеть здесь функцию, которую вы искали.

Ответ 5

Лучшая библиотека, которую я знаю для разрыва продолжительности, countdown.js. Он обрабатывает все жесткие случаи, такие как високосные годы и летнее время, как csg, упомянутые, и даже позволяет указывать нечеткие понятия, такие как месяцы и недели. Вот код для вашего дела:

//assuming these are in *seconds* (in case of MS don't multiply by 1000 below)
var date_now = 1218374; 
var date_future = 29384744;

diff = countdown(date_now * 1000, date_future * 1000, 
            countdown.DAYS | countdown.HOURS | countdown.MINUTES | countdown.SECONDS);
alert("days: " + diff.days + " hours: " + diff.hours + 
      " minutes: " + diff.minutes + " seconds: " + diff.seconds);

//or even better
alert(diff.toString()); 

Здесь JSFiddle, но он, вероятно, будет работать только в FireFox или в Chrome с отключенной веб-безопасностью, поскольку countdown.js размещенный с текстовым/равным MIME-типом (вы должны обслуживать файл, а не ссылку на countdownjs.org).

Ответ 6

function update(datetime = "2017-01-01 05:11:58") {
    var theevent = new Date(datetime);
    now = new Date();
    var sec_num = (theevent - now) / 1000;
    var days    = Math.floor(sec_num / (3600 * 24));
    var hours   = Math.floor((sec_num - (days * (3600 * 24)))/3600);
    var minutes = Math.floor((sec_num - (days * (3600 * 24)) - (hours * 3600)) / 60);
    var seconds = Math.floor(sec_num - (days * (3600 * 24)) - (hours * 3600) - (minutes * 60));

    if (hours   < 10) {hours   = "0"+hours;}
    if (minutes < 10) {minutes = "0"+minutes;}
    if (seconds < 10) {seconds = "0"+seconds;}

    return  days+':'+ hours+':'+minutes+':'+seconds;
}

Ответ 7

Вот пример кода. Я использовал простые вычисления вместо использования предварительных вычислений, например, 1 день - 86400 секунд. Таким образом, вы можете легко следовать логике.

// Calculate time between two dates:
var date1 = new Date('1110-01-01 11:10');
var date2 = new Date();

console.log('difference in ms', date1 - date2);

// Use Math.abs() so the order of the dates can be ignored and you won't
// end up with negative numbers when date1 is before date2.
console.log('difference in ms abs', Math.abs(date1 - date2));
console.log('difference in seconds', Math.abs(date1 - date2) / 1000);

var diffInSeconds = Math.abs(date1 - date2) / 1000;
var days = Math.floor(diffInSeconds / 60 / 60 / 24);
var hours = Math.floor(diffInSeconds / 60 / 60 % 24);
var minutes = Math.floor(diffInSeconds / 60 % 60);
var seconds = Math.floor(diffInSeconds % 60);
var milliseconds = Math.round((diffInSeconds - Math.floor(diffInSeconds)) * 1000);

console.log('days', days);
console.log('hours', ('0' + hours).slice(-2));
console.log('minutes', ('0' + minutes).slice(-2));
console.log('seconds', ('0' + seconds).slice(-2));
console.log('milliseconds', ('00' + milliseconds).slice(-3));

Ответ 8

Используйте библиотеку moment.js, например:

var time = date_future - date_now;
var seconds = moment.duration(time).seconds();
var minutes = moment.duration(time).minutes();
var hours   = moment.duration(time).hours();
var days    = moment.duration(time).days();

Ответ 9

вот код, чтобы найти разницу между двумя датами в днях, часах, минутах, секундах (предполагая, что будущая дата - дата нового года).

var one_day = 24*60*60*1000;              // total milliseconds in one day

var today = new Date();
var new_year = new Date("01/01/2017");    // future date

var today_time = today.getTime();         // time in miliiseconds
var new_year_time = new_year.getTime();                         

var time_diff = Math.abs(new_year_time - today_time);  //time diff in ms  
var days = Math.floor(time_diff / one_day);            // no of days

var remaining_time = time_diff - (days*one_day);      // remaining ms  

var hours = Math.floor(remaining_time/(60*60*1000));   
remaining_time = remaining_time - (hours*60*60*1000);  

var minutes = Math.floor(remaining_time/(60*1000));        
remaining_time = remaining_time - (minutes * 60 * 1000);   

var seconds = Math.ceil(remaining_time / 1000);   

Ответ 10

let delta = Math.floor(Math.abs(start.getTime() - end.getTime()) / 1000);
let hours = Math.floor(delta / 3600);
delta -= hours * 3600;
let minutes = Math.floor(delta / 60);
delta -= minutes * 60;
let seconds = delta;
if (hours.toString().length === 1) {
  hours = '0${hours}';
}
if (minutes.toString().length === 1) {
  minutes = '0${minutes}';
}
if (seconds.toString().length === 1) {
  seconds = '0${seconds}';
}
const recordingTime = '${hours}:${minutes}:${seconds}';

Ответ 11

Короткий и гибкий с поддержкой отрицательных значений, хотя с использованием двух запятых выражений :)

function timeUnitsBetween(startDate, endDate) {
  let delta = Math.abs(endDate - startDate) / 1000;
  const isNegative = startDate > endDate ? -1 : 1;
  return [
    ['days', 24 * 60 * 60],
    ['hours', 60 * 60],
    ['minutes', 60],
    ['seconds', 1]
  ].reduce((acc, [key, value]) => (acc[key] = Math.floor(delta / value) * isNegative, delta -= acc[key] * isNegative * value, acc), {});
}

Пример:

timeUnitsBetween(new Date("2019-02-11T02:12:03+00:00"), new Date("2019-02-11T01:00:00+00:00"));
// { days: -0, hours: -1, minutes: -12, seconds: -3 }

Вдохновленный решением RienNeVaPlu.

Ответ 12

MomentJS имеет функцию для этого:

const start = moment(j.timings.start);
const end = moment(j.timings.end);
const elapsedMinutes = end.diff(start, "minutes");

Ответ 13

мое решение не так ясно, как это, но я приведу его в качестве другого примера

console.log(duration('2019-07-17T18:35:25.235Z', '2019-07-20T00:37:28.839Z'));

function duration(t0, t1){
    let d = (new Date(t1)) - (new Date(t0));
    let weekdays     = Math.floor(d/1000/60/60/24/7);
    let days         = Math.floor(d/1000/60/60/24 - weekdays*7);
    let hours        = Math.floor(d/1000/60/60    - weekdays*7*24            - days*24);
    let minutes      = Math.floor(d/1000/60       - weekdays*7*24*60         - days*24*60         - hours*60);
    let seconds      = Math.floor(d/1000          - weekdays*7*24*60*60      - days*24*60*60      - hours*60*60      - minutes*60);
    let milliseconds = Math.floor(d               - weekdays*7*24*60*60*1000 - days*24*60*60*1000 - hours*60*60*1000 - minutes*60*1000 - seconds*1000);
    let t = {};
    ['weekdays', 'days', 'hours', 'minutes', 'seconds', 'milliseconds'].forEach(q=>{ if (eval(q)>0) { t[q] = eval(q); } });
    return t;
}