Я преобразовал целое число в формат даты, но объект даты не принимает очень большие целые числа.
Ваш метод:
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))}`);