Преобразование больших целых чисел, таких как 9829143, в объект даты - PullRequest
0 голосов
/ 06 апреля 2020

Я преобразовал целое число в формат даты, но объект даты не принимает очень большие целые числа. Примеры выходных данных показывают, что дата может go даже до «96 дней, 11 часов, 31 минуты и 35 секунд», но способ, которым я ее отформатировал, идет только до 6 дней. Я пытался использовать метод BigInt на секундах, но дата становится недействительной.

const formatDuration = seconds => {
   let str = "";

  let date = new Date(0, 0, 0, 0, 0, seconds, 0);
  if (seconds == 0) {
    str += "now";
  }
 if (date.getHours() == 0) {
    if (date.getDay() > 1) {
      str += date.getDay() + " " + "days";
    } else if (date.getDay() == 1) {
      str += date.getDay() + " " + "day";
    }
  } else if (date.getDay() > 1) {
    str += date.getDay() + " " + "days" + ", ";
  } else if (date.getDay() == 1) {
    str += date.getDay() + " " + "day" + ", ";
  }
 
  
  if(date.getMinutes() == 0) {
  if (date.getHours() > 1) {
    str += +date.getHours() + " " + "hours" ;
  } else if (date.getHours() == 1) {
    str += date.getHours() + " " + "hour";
  }
} else  if (date.getHours() > 1) {
    str += +date.getHours() + " " + "hours" + ", ";
  } else if (date.getHours() == 1) {
    str += date.getHours() + " " + "hour" + ", ";
  }
  
  if (date.getSeconds() == 0) {
    if (date.getMinutes() > 1) {
      str += date.getMinutes() + " " + "minutes";
    } else if (date.getMinutes() == 1) {
      str += date.getMinutes() + " " + "minute";
    }
  } else if (date.getMinutes() > 1) {
    str += date.getMinutes() + " " + "minutes" + " and ";
  } else if (date.getMinutes() == 1) {
    str += date.getMinutes() + " " + "minute" + " and ";
  } 
  if (date.getSeconds() > 1) {
    str += date.getSeconds() + " " + "seconds";
  } else if (date.getSeconds() == 1) {
    str += date.getSeconds() + " " + "second";
  }
 
  return str;
}

console.log(formatDuration(3600));
console.log(formatDuration(9829143));

1 Ответ

0 голосов
/ 07 апреля 2020

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

Ваш метод:

let date = new Date(0, 0, 0, 0, 0, seconds, 0);

Более лаконичен, если в конструктор передается только число:

let date = new Date(seconds * 1000);

Он рассматривается как миллисекунды с 1970- 01-01T00: 00: 00Z (эпоха ECMAScript). См. Преобразование отметки времени Unix во время в JavaScript.

Результаты выборки показывают, что дата может go даже до 96 дней, 11 часов. , 31 минута и 35 секунд, но то, как я ее отформатировал, длится всего 6 дней.

A Объект даты может обрабатывать диапазон от -100 000 000 дней до 100 000 000 дней с начала эпохи (приблизительно ± 273 785 лет).

I попытался использовать метод BigInt в секундах, но дата становится недействительной.

Ваша проблема в том, что вы используете методы Date неправильно.

if (date.getDay() > 1) {
  str += date.getDay() + " " + "days";

getDay метод возвращает день недели от 0 до 6, представляющий воскресенье и следующую субботу.

Чтобы преобразовать секунды в дни, часы и т. д. c. и предполагая, что все дни имеют длину ровно 24 часа (т.е. игнорируя дни перехода на летнее время), разделите последовательно на различные единицы, например,

// Convert seconds to [days,hours,minutes,seconds]
function secondsToDays(sec) {
  let d = sec/8.64e4 | 0;
  let h = (sec % 8.64e4) / 3.6e3 | 0;
  let m = (sec % 3.6e3) / 60 | 0;
  let s = sec % 60;  
  return [d,h,m,s];
}

// Covert d:h:m:s to seconds
function daysToSecs(s) {
  let b = s.split(':');
  return b[0]*8.64e4 + b[1]*3.6e3 + b[2]*60 + b[3]*1;
}

// Format time from array of [d,h,m,s]
function formatTime(parts) {
  let [d, h, m, s] = parts;
  let pl = (n, u) => u + (n == 1? '':'s');
  return [`${d? d.toLocaleString('en') + pl(d, ' day') : ''}`,
          `${h? h + pl(h, ' hour') : ''}`,
          `${m? m + pl(m, ' minute') : ''}`,
          `${s? s + pl(s, ' second') : ''}`].join(' ');
}

let secs = daysToSecs('1428:1:33:9');
console.log(`${secs} seconds is ${formatTime(secondsToDays(secs))}`);
...