Проблема с вычитанием дат в реальном времени с использованием setinterval - PullRequest
1 голос
/ 28 апреля 2020

В этом скрипте я использую некоторые функции и библиотеку xDate для создания истинных форматных дат. Я пытаюсь сделать небольшой скрипт, который показывает разницу между двумя датами и временем в реальном времени, но я не вижу ошибки в коде, которая не позволяет это сделать. Где ошибка?

jQuery(window).on("load", function() {
  function parseISOLocal(s) {
    // Split string into its parts
    var b = s.split(/\D/);
    // Create and return a date object
    return new Date(b[0], b[1] - 1, b[2], b[3], b[4], b[5]);
  }

  // Convert a millisecond value to days, hours, minutes and seconds
  function formatDHMS(ms) {
    // Helper to add 's' to a number if other than 1
    function addS(n) {
      return n == 1 ? '' : 's';
    }

    var d = ms / 8.64e7 | 0;
    var h = (ms % 8.64e7) / 3.6e6 | 0;
    var m = (ms % 3.6e6) / 6e4 | 0;
    var s = (ms % 6e4) / 1e3 | 0;

    dd = (d != 0) ? d + ' day' + addS(d) + ', ' : "";
    hh = (h != 0) ? h + ' hours' + addS(h) + ', ' : "";
    mm = (m != 0) ? m + ' minute' + addS(m) + ', ' : "";
    ss = (s != 0) ? s + ' second' + addS(s) + ' ' : "";

    return ((d + h + m + s) > 0) ? dd + hh + mm + ss : "Time is over";
  }

  Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
  }

  var date = new Date("2020-05-01 12:24:23");

  var d1 = new XDate(date.addDays(2));
  future_time = d1.toString("yyyy-MM-dd HH:mm:ss");
  var d = new XDate();

  current_time = d.toString("yyyy-MM-dd HH:mm:ss");

  var someDate = new Date();
  someDate.setDate(someDate.getDate() + 15); //number  of days to add, e.x. 15 days
  var dateFormated = someDate.toISOString().substr(0, 10);
  console.log(dateFormated);

  function Repeat() {

    setInterval(function() {

      current_time = d.toString("yyyy-MM-dd HH:mm:ss");

      $('#timeForSign').html(formatDHMS(parseISOLocal(future_time) - parseISOLocal(current_time)));
    }, 100);
  }

  setTimeout(Repeat, 500);


});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="http://www.outsourcer.info/xdate.js"></script>
<div id="timeForSign"></div>

1 Ответ

1 голос
/ 28 апреля 2020

Проблема в том, что вы только когда-либо сравниваете значение d в пределах интервала, и оно никогда не меняется Чтобы это исправить, вам просто нужно заменить d на new Date() или new XDate(), если вы предпочитаете использовать эту библиотеку:

current_time = new XDate().toString("yyyy-MM-dd HH:mm:ss");

Кроме того, в вашем * довольно много переменных 1015 *, которые не нужны и могут быть удалены. Попробуйте это:

jQuery(window).on("load", function() {
  let future_time = parseISOLocal(new XDate(new Date("2020-05-01 12:24:23").addDays(2)).toString("yyyy-MM-dd HH:mm:ss"));

  function Repeat() {
    setInterval(function() {
      let current_time = new XDate().toString("yyyy-MM-dd HH:mm:ss");
      $('#timeForSign').html(formatDHMS(future_time - parseISOLocal(current_time)));
    }, 100);
  }

  setTimeout(Repeat, 500);
});

Date.prototype.addDays = function(days) {
  var date = new Date(this.valueOf());
  date.setDate(date.getDate() + days);
  return date;
}

function parseISOLocal(s) {
  var b = s.split(/\D/);
  return new Date(b[0], b[1] - 1, b[2], b[3], b[4], b[5]);
}

function formatDHMS(ms) {
  let addS = (n) => n == 1 ? '' : 's';
  let d = ms / 8.64e7 | 0;
  let h = (ms % 8.64e7) / 3.6e6 | 0;
  let m = (ms % 3.6e6) / 6e4 | 0;
  let s = (ms % 6e4) / 1e3 | 0;
    
  let t = [
    d + ' day' + addS(d),
    h + ' hour' + addS(m),
    m + ' minute' + addS(h),
    s + ' second' + addS(s)
  ];    
  return ms > 0 ? t.join(', ') : "Time is over";
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/xdate@0.8.2/src/xdate.js"></script>
<div id="timeForSign"></div>
...