Calculate Time Difference with JavaScript

后端 未结 12 1142
有刺的猬
有刺的猬 2020-12-01 13:20

I have two HTML input boxes, that need to calculate the time difference in JavaScript onBlur (since I need it in real time) and insert the result to new input box.

F

12条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-01 13:42

    tl;dr

    One off run

    const t1 = new Date(1579876543210) // your initial time
    const t2 = new Date(1579987654321) // your later time
    
    const diff = t2-t1
    const SEC = 1000, MIN = 60 * SEC, HRS = 60 * MIN
    const humanDiff = `${Math.floor(diff/HRS)}:${Math.floor((diff%HRS)/MIN).toLocaleString('en-US', {minimumIntegerDigits: 2})}:${Math.floor((diff%MIN)/SEC).toLocaleString('en-US', {minimumIntegerDigits: 2})}.${Math.floor(diff % SEC).toLocaleString('en-US', {minimumIntegerDigits: 4, useGrouping: false})}`
    
    console.log("humanDiff:", humanDiff)
    // > humanDiff: 30:51:51.0111

    As a function

    function humanDiff (t1, t2) {
      const diff = Math.max(t1,t2) - Math.min(t1,t2) 
      const SEC = 1000, MIN = 60 * SEC, HRS = 60 * MIN
      
      const hrs = Math.floor(diff/HRS)
      const min = Math.floor((diff%HRS)/MIN).toLocaleString('en-US', {minimumIntegerDigits: 2})
      const sec = Math.floor((diff%MIN)/SEC).toLocaleString('en-US', {minimumIntegerDigits: 2})
      const ms = Math.floor(diff % SEC).toLocaleString('en-US', {minimumIntegerDigits: 4, useGrouping: false})
      
      return `${hrs}:${min}:${sec}.${ms}`
    }
    
    const t1 = new Date(1579876543210)
    const t2 = new Date(1579987654321)
    
    console.log("humanDiff(t1, t2):", humanDiff(t1, t2))
    // > humanDiff: 30:51:51.0111

    Explanation

    Adjust humanDiff for your maximum and minimum reportable increments and formatting needs:

    const t1 = new Date(1579876543210) // Set your initial time (`t1`)
    const t2 = new Date(1579986654321) // , conclusion time (`t2`), and
    const diff = t2-t1 // calculate their difference in milliseconds
    console.log("         t2:", t2.toISOString()) // >   t2: 2020-01-25T21:27:34.321Z
    console.log("         t1:", t1.toISOString()) // >   t1: 2020-01-24T14:35:43.210Z
    console.log("       diff:", diff)             // > diff: 111111111
    
    // Set your constant time values for easy readability
    const SEC = 1000
    const MIN = 60 * SEC
    const HRS = 60 * MIN
    
    /* For a given unit
    1) disregard any previously relevant units, e.g. to calculate minutes, we can
       disregard all hours & focus on only the remainder - `(diff%HRS)`
    2) divide the remainder by the given unit, e.g. for minutes, `(diff%HRS)/MIN`
    3) disregard any remainder, e.g. again for minutes, `Math.floor((diff%HRS)/MIN)`
    NOTE: for your maximum unit (HRS in the examples below) you probably _don't_
      want to disregard high values, e.g. If the difference is >24 hrs and something,
      you should either include a DAYS value, or simply display 30 hrs */
    let hrs = Math.floor(diff/HRS)
    let min = Math.floor((diff%HRS)/MIN)
    let sec = Math.floor((diff%MIN)/SEC)
    let ms  = Math.floor(diff % SEC) // just the remainder 
              // BUT ms IS NOT ACTUALLY CORRECT, see humanDiff_3 for the fix ;-)
    let humanDiff_1 = `${hrs}:${min}:${sec}.${ms}`
    console.log("humanDiff_1:", humanDiff_1)
    // > humanDiff_1: 30:51:51.111
    
    sec = Math.round((diff%MIN)/SEC) // can also just round the last unit
    const humanDiff_2 = `${hrs} hrs ${min} mins & ${sec} secs`
    console.log("humanDiff_2:", humanDiff_2)
    // > humanDiff_2: 30 hrs 51 mins & 51 secs
    
    /* To ensure a set number of digits, format the numbers with `toLocaleString`'s
       `minimumIntegerDigits`, if more than 3 digits, also use its `useGrouping`   */
    hrs = Math.floor(diff/HRS)
    min = Math.floor((diff%HRS)/MIN).toLocaleString('en-US', {minimumIntegerDigits: 2})
    sec = Math.floor((diff%MIN)/SEC).toLocaleString('en-US', {minimumIntegerDigits: 2})
    ms = Math.floor(diff % SEC).toLocaleString('en-US', {minimumIntegerDigits: 4, useGrouping: false})
    
    const humanDiff_3 = `${hrs}:${min}:${sec}.${ms}`
    console.log("humanDiff_3:", humanDiff_3)
    // > humanDiff_3: 30:51:51.0111
    // NOTE: milliseconds are now 4 digits

提交回复
热议问题