Як перетворити мілісекунди часу у формат годин, хв, сек у JavaScript?


86

У мене час у мілісекундах, але мені потрібен час після перетворення 00:00:00.

Наприклад: у мілісекундах = 86400000. Я хочу, скільки годин за ці мілісекунди,00:00:00

Як отримати його в JavaScript?

Відповіді:


122

Як щодо цього, створивши функцію в javascript, як показано нижче:

function msToTime(duration) {
  var milliseconds = parseInt((duration % 1000) / 100),
    seconds = Math.floor((duration / 1000) % 60),
    minutes = Math.floor((duration / (1000 * 60)) % 60),
    hours = Math.floor((duration / (1000 * 60 * 60)) % 24);

  hours = (hours < 10) ? "0" + hours : hours;
  minutes = (minutes < 10) ? "0" + minutes : minutes;
  seconds = (seconds < 10) ? "0" + seconds : seconds;

  return hours + ":" + minutes + ":" + seconds + "." + milliseconds;
}
console.log(msToTime(300000))


Я використав цей спосіб для перетворення мілісекунд у години: хвилин: секунд format.but я не зрозумів правильно. Це дає лише 21:11:05 за всі мілісекунди. Як я можу це реалізувати?
cheliyan

1
var s = st_date + '' + start; var e = дата_кінця + '' + кінець; var біти = s.split (/ \ D /); var bits1 = e.split (/ \ D /); дата змінної = нова дата (біти [0], --біти [1], біти [2], біти [3], біти [4], біти [5]); var date1 = нова дата (біти1 [0], --бити1 [1], біти1 [2], біти1 [3], біти1 [4], біти1 [5]);
cheliyan

var t1 = date.getTime () var t2 = date1.getTime () var t3 = date1.getTime () - date.getTime (); var секунд; var хвилин; var мілісекунд = parseInt ((t3% 1000) / 100), секунд = parseInt ((t3 / 1000)% 60), хвилин = parseInt ((t3 / (1000 * 60))% 60), годин = parseInt ((t3 / (1000 * 60 * 60))% 24); годин = (годин <10)? "0" + годин: годин; хвилини = (хвилини <10)? "0" + хвилин: хвилин; секунди = (секунди <10)? "0" + секунди: секунди; тривалість = години + ":" + хвилини + ":" + секунди; alert ('dur ::' + t3); попередження ('тривалість:' + тривалість);
cheliyan

6
parseInt (рядок) не є оптимальним способом підлоги. Наприклад, ви не можете використовувати його в машинописі. Також чому ms / 100? Це зовсім не гарна відповідь.
Домінік

1
jsperf.com/test-parseint-and-math-floor Floor набагато швидший за ParseInt
Matthieu Riegler

53

Перетворити час у мілісекундах на зручний для читання формат.

 function timeConversion(millisec) {

        var seconds = (millisec / 1000).toFixed(1);

        var minutes = (millisec / (1000 * 60)).toFixed(1);

        var hours = (millisec / (1000 * 60 * 60)).toFixed(1);

        var days = (millisec / (1000 * 60 * 60 * 24)).toFixed(1);

        if (seconds < 60) {
            return seconds + " Sec";
        } else if (minutes < 60) {
            return minutes + " Min";
        } else if (hours < 24) {
            return hours + " Hrs";
        } else {
            return days + " Days"
        }
    }

"Викладений зразок"


4
Я знайшов цей варіант найбільш корисним, головна відповідь, здається, не дуже добре обробляла години в моєму тестуванні, і це також дає вам варіанти днів.
ak85

21

У мене була та ж проблема, ось що я закінчила робити:

function parseMillisecondsIntoReadableTime(milliseconds){
  //Get hours from milliseconds
  var hours = milliseconds / (1000*60*60);
  var absoluteHours = Math.floor(hours);
  var h = absoluteHours > 9 ? absoluteHours : '0' + absoluteHours;

  //Get remainder from hours and convert to minutes
  var minutes = (hours - absoluteHours) * 60;
  var absoluteMinutes = Math.floor(minutes);
  var m = absoluteMinutes > 9 ? absoluteMinutes : '0' +  absoluteMinutes;

  //Get remainder from minutes and convert to seconds
  var seconds = (minutes - absoluteMinutes) * 60;
  var absoluteSeconds = Math.floor(seconds);
  var s = absoluteSeconds > 9 ? absoluteSeconds : '0' + absoluteSeconds;


  return h + ':' + m + ':' + s;
}


var time = parseMillisecondsIntoReadableTime(86400000);

alert(time);


17

Це повертає час, як відео на YouTube

    function getYoutubeLikeToDisplay(millisec) {
        var seconds = (millisec / 1000).toFixed(0);
        var minutes = Math.floor(seconds / 60);
        var hours = "";
        if (minutes > 59) {
            hours = Math.floor(minutes / 60);
            hours = (hours >= 10) ? hours : "0" + hours;
            minutes = minutes - (hours * 60);
            minutes = (minutes >= 10) ? minutes : "0" + minutes;
        }

        seconds = Math.floor(seconds % 60);
        seconds = (seconds >= 10) ? seconds : "0" + seconds;
        if (hours != "") {
            return hours + ":" + minutes + ":" + seconds;
        }
        return minutes + ":" + seconds;
    }

Вихід:

  • getYoutubeLikeToDisplay (129900) = "2:10"
  • getYoutubeLikeToDisplay (1229900) = "20:30"
  • getYoutubeLikeToDisplay (21229900) = "05:53:50"

коментар - не працює коректно в негативний час, наприклад, -3000повинен відображатися, -00:03але він повертається -1:0-03.
ана

16

Ось моє рішення

let h,m,s;
h = Math.floor(timeInMiliseconds/1000/60/60);
m = Math.floor((timeInMiliseconds/1000/60/60 - h)*60);
s = Math.floor(((timeInMiliseconds/1000/60/60 - h)*60 - m)*60);

// отримати формат часу 00:00:00

s < 10 ? s = `0${s}`: s = `${s}`
m < 10 ? m = `0${m}`: m = `${m}`
h < 10 ? h = `0${h}`: h = `${h}`


console.log(`${s}:${m}:${h}`);

ВЕЛИКИЙ. Дякую.
Енді

Найчистіша відповідь на це питання.
muad-dweeb

2
Я б встановив значення s за межами тернарного оператора:s = `${s < 10 ? '0': ''}${s}`
seniorpreacher

9

Вибачте, пізно на вечірку. Прийнята відповідь не вирізала її для мене, тому я написав її сам.

Вихід:

2h 59s
1h 59m
1h
1h 59s
59m 59s
59s

Код (машинопис):

function timeConversion(duration: number) {
  const portions: string[] = [];

  const msInHour = 1000 * 60 * 60;
  const hours = Math.trunc(duration / msInHour);
  if (hours > 0) {
    portions.push(hours + 'h');
    duration = duration - (hours * msInHour);
  }

  const msInMinute = 1000 * 60;
  const minutes = Math.trunc(duration / msInMinute);
  if (minutes > 0) {
    portions.push(minutes + 'm');
    duration = duration - (minutes * msInMinute);
  }

  const seconds = Math.trunc(duration / 1000);
  if (seconds > 0) {
    portions.push(seconds + 's');
  }

  return portions.join(' ');
}

console.log(timeConversion((60 * 60 * 1000) + (59 * 60 * 1000) + (59 * 1000)));
console.log(timeConversion((60 * 60 * 1000) + (59 * 60 * 1000)              ));
console.log(timeConversion((60 * 60 * 1000)                                 ));
console.log(timeConversion((60 * 60 * 1000)                    + (59 * 1000)));
console.log(timeConversion(                   (59 * 60 * 1000) + (59 * 1000)));
console.log(timeConversion(                                      (59 * 1000)));

Дякую, чоловіче, цього я хотів. Довелося трохи адаптуватися, щоб показати "0h 0m 10s" тощо, але в іншому випадку чисто і просто
HazeyAce

Я почав писати свій власний, а потім подумав, напевно, хтось уже це робив :). Дякую!
Ben S

6

Вищезазначені фрагменти не працюють для випадків, що тривають більше 1 дня (їх просто ігнорують).

Для цього ви можете використовувати:

function convertMS(ms) {
    var d, h, m, s;
    s = Math.floor(ms / 1000);
    m = Math.floor(s / 60);
    s = s % 60;
    h = Math.floor(m / 60);
    m = m % 60;
    d = Math.floor(h / 24);
    h = h % 24;
    h += d * 24;
    return h + ':' + m + ':' + s;
}

введіть тут опис зображення

Завдяки https://gist.github.com/remino/1563878


1
Щоб отримати більш гуманізований вихід, ви можете повернути щось на зразок: return ((h + '') .length === 1? '0' + h: h) + ':' + ('0' + m) .substr (- 2) + ':' + ('0' + s) .substr (-2);
Vitall

@Vitall Просто використовуйте return (h < 10 ? "0" + h : h) + ":" + (m < 10 ? "0" + m : m) + ":" + (s < 10 ? "0" + s : s);, тому що це краще робити за допомогою математики, ніж купу маніпуляцій з рядками.
Mitch McMabers

3

Мені потрібен був час лише до однієї доби, 24 години, це була моя думка:

const milliseconds = 5680000;

const hours = `0${new Date(milliseconds).getHours() - 1}`.slice(-2);
const minutes = `0${new Date(milliseconds).getMinutes()}`.slice(-2);
const seconds = `0${new Date(milliseconds).getSeconds()}`.slice(-2);

const time = `${hours}:${minutes}:${seconds}`
console.log(time);

Ви могли б отримати дні таким чином, якщо це потрібно.


3

Це рішення використовує одну functionдля розділення мілісекунд на a parts object, а іншу functionдля форматуванняparts object .

Я створив 2 функції формату, одну за вашим запитом, а іншу, яка друкує дружній рядок з урахуванням однини / множини, і включає опцію показу мілісекунд.

function parseDuration(duration) {
  let remain = duration

  let days = Math.floor(remain / (1000 * 60 * 60 * 24))
  remain = remain % (1000 * 60 * 60 * 24)

  let hours = Math.floor(remain / (1000 * 60 * 60))
  remain = remain % (1000 * 60 * 60)

  let minutes = Math.floor(remain / (1000 * 60))
  remain = remain % (1000 * 60)

  let seconds = Math.floor(remain / (1000))
  remain = remain % (1000)

  let milliseconds = remain

  return {
    days,
    hours,
    minutes,
    seconds,
    milliseconds
  };
}

function formatTime(o, useMilli = false) {
  let parts = []
  if (o.days) {
    let ret = o.days + ' day'
    if (o.days !== 1) {
      ret += 's'
    }
    parts.push(ret)
  }
  if (o.hours) {
    let ret = o.hours + ' hour'
    if (o.hours !== 1) {
      ret += 's'
    }
    parts.push(ret)
  }
  if (o.minutes) {
    let ret = o.minutes + ' minute'
    if (o.minutes !== 1) {
      ret += 's'
    }
    parts.push(ret)

  }
  if (o.seconds) {
    let ret = o.seconds + ' second'
    if (o.seconds !== 1) {
      ret += 's'
    }
    parts.push(ret)
  }
  if (useMilli && o.milliseconds) {
    let ret = o.milliseconds + ' millisecond'
    if (o.milliseconds !== 1) {
      ret += 's'
    }
    parts.push(ret)
  }
  if (parts.length === 0) {
    return 'instantly'
  } else {
    return parts.join(' ')
  }
}

function formatTimeHMS(o) {
  let hours = o.hours.toString()
  if (hours.length === 1) hours = '0' + hours

  let minutes = o.minutes.toString()
  if (minutes.length === 1) minutes = '0' + minutes

  let seconds = o.seconds.toString()
  if (seconds.length === 1) seconds = '0' + seconds

  return hours + ":" + minutes + ":" + seconds
}

function formatDurationHMS(duration) {
  let time = parseDuration(duration)
  return formatTimeHMS(time)
}

function formatDuration(duration, useMilli = false) {
  let time = parseDuration(duration)
  return formatTime(time, useMilli)
}


console.log(formatDurationHMS(57742343234))

console.log(formatDuration(57742343234))
console.log(formatDuration(5423401000))
console.log(formatDuration(500))
console.log(formatDuration(500, true))
console.log(formatDuration(1000 * 30))
console.log(formatDuration(1000 * 60 * 30))
console.log(formatDuration(1000 * 60 * 60 * 12))
console.log(formatDuration(1000 * 60 * 60 * 1))


3

Зручний для читання код для зчитуваного людиною результату, і ви можете поширити це на світлові роки або наносекунди або те, що у вас дуже інтуїтивно. Очевидно, ви хочете перетворити це на функцію і повторно використати деякі з цих проміжних викликів за модулем.

second = 1000 
minute = second * 60
hour = minute * 60 
day = hour * 24

test = 3 * day + 2 * hour + 11 * minute + 58 * second

console.log(Math.floor(test / day))
console.log(Math.floor(test % day / hour))
console.log(Math.floor(test % day % hour / minute))
console.log(Math.floor(test % day % hour % minute / second))

2

На основі відповіді @Chand. Це реалізація в Typescript. Трохи безпечніше, ніж примусові типи в JS. Якщо видалити анотацію типу, має бути дійсним JS. Також використовується нові рядкові функції для нормалізації часу.

function displayTime(millisec: number) {
 const normalizeTime = (time: string): string => (time.length === 1) ? time.padStart(2, '0') : time;

 let seconds: string = (millisec / 1000).toFixed(0);
 let minutes: string = Math.floor(parseInt(seconds) / 60).toString();
 let hours: string = '';

 if (parseInt(minutes) > 59) {
   hours = normalizeTime(Math.floor(parseInt(minutes) / 60).toString());
   minutes = normalizeTime((parseInt(minutes) - (parseInt(hours) * 60)).toString());
 }
 seconds = normalizeTime(Math.floor(parseInt(seconds) % 60).toString());

 if (hours !== '') {
    return `${hours}:${minutes}:${seconds}`;
 }
   return `${minutes}:${seconds}`;
}

1
Хтось може виявити це корисним.
KevinOrfas

1
JS розвивається у напрямку TypeScript. Ймовірно, це незабаром буде дійсним JS. :-)
N8allan

2

Працював у мене

msToTime(milliseconds) {
    //Get hours from milliseconds
    var hours = milliseconds / (1000*60*60);
    var absoluteHours = Math.floor(hours);
    var h = absoluteHours > 9 ? absoluteHours : '0' + absoluteHours;

    //Get remainder from hours and convert to minutes
    var minutes = (hours - absoluteHours) * 60;
    var absoluteMinutes = Math.floor(minutes);
    var m = absoluteMinutes > 9 ? absoluteMinutes : '0' +  absoluteMinutes;

    //Get remainder from minutes and convert to seconds
    var seconds = (minutes - absoluteMinutes) * 60;
    var absoluteSeconds = Math.floor(seconds);
    var s = absoluteSeconds > 9 ? absoluteSeconds : '0' + absoluteSeconds;

    return h == "00" ? m + ':' + s : h + ':' + m + ':' + s;
}

1

моє рішення

var sunriseMills = 1517573074000;         // sunrise in NewYork on Feb 3, 2018  - UTC time
var offsetCityMills = -5 * 3600 * 1000;   // NewYork delay to UTC 
var offsetDeviceMills =  new Date().getTimezoneOffset() * 60 * 1000 ;  // eg. I live in Romania (UTC+2) >> getTimezoneOffset() = 120

var textTime = new Date(sunriseMills + offsetCityMills + offsetDeviceMills) 
    .toLocaleTimeString('en-US', { hour: 'numeric', minute: 'numeric' });

textTime стане " 7.04 AM "


1

Розширюючи відповідь @ Rick, я віддаю перевагу приблизно такому:

function msToReadableTime(time){
  const second = 1000;
  const minute = second * 60;
  const hour = minute * 60;

  let hours = Math.floor(time / hour % 24);
  let minutes = Math.floor(time / minute % 60);
  let seconds = Math.floor(time / second % 60);
 

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

0

Якщо ви використовуєте машинопис, це може бути добре для вас

enum ETime {
  Seconds = 1000,
  Minutes = 60000,
  Hours = 3600000,
  SecInMin = 60,
  MinInHours = 60,
  HoursMod = 24,
  timeMin = 10,
}

interface ITime {
  millis: number
  modulo: number
}

const Times = {
  seconds: {
    millis: ETime.Seconds,
    modulo: ETime.SecInMin,
  },
  minutes: {
    millis: ETime.Minutes,
    modulo: ETime.MinInHours,
  },
  hours: {
    millis: ETime.Hours,
    modulo: ETime.HoursMod,
  },
}

const dots: string = ":"

const msToTime = (duration: number, needHours: boolean = true): string => {
  const getCorrectTime = (divider: ITime): string => {
    const timeStr: number = Math.floor(
      (duration / divider.millis) % divider.modulo,
    )

    return timeStr < ETime.timeMin ? "0" + timeStr : String(timeStr)
  }

  return (
    (needHours ? getCorrectTime(Times.hours) + dots : "") +
    getCorrectTime(Times.minutes) +
    dots +
    getCorrectTime(Times.seconds)
  )
}

0

У своїй реалізації я використав Moment.js:

export default (value) => 
  const duration = moment.duration(value);

  const milliseconds = duration.milliseconds();
  const seconds = duration.seconds();
  const minutes = duration.minutes();
  const hours = duration.hours();
  const day = duration.days();

  const sDay = `${day}d `;
  const sHours = (hours < 10) ? `0${hours}h ` : `${hours}h `;
  const sMinutes = (minutes < 10) ? `0${minutes}' ` : `${minutes}' `;
  const sSeconds = (seconds < 10) ? `0${seconds}" ` : `${seconds}" `;
  const sMilliseconds = `${milliseconds}ms`;

  ...
}

Отримавши струни, я склав їх, як хочу.


0

Я працюю для мене, оскільки отримую мілісекунди = 1592380675409, використовуючи метод javascript getTime (), який повертає кількість мілісекунд між північчю 1 січня 1970 року та вказаною датою.

var d = new Date();//Wed Jun 17 2020 13:27:55 GMT+0530 (India Standard Time)
var n = d.getTime();//1592380675409 this value is store somewhere

//function call 
console.log(convertMillisecToHrMinSec(1592380675409));

var convertMillisecToHrMinSec = (time) => {
  let date = new Date(time);
  let hr = date.getHours();
  let min = date.getMinutes();
  let sec = date.getSeconds();

  hr = (hr < 10) ? "0"+ hr : hr;
  min = (min < 10) ? "0"+ min : min;
  sec = (sec < 10) ? "0"+ sec : sec;

  return hr + ':' + min + ":" + sec;//01:27:55
}

Поясніть свій код, код без пояснення - це поганий код.
Іслам Ельшобокши

Дякую за пропозицію, я однозначно пояснюю своє рішення
Sneha Morye
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.