2016-01-03 31 views
1

我在製作秒錶時只能使用2位數的毫秒部分。我有完整的JSFiddle here。我可以使用一些幫助的功能是formatter()方法。將毫秒從3位更改爲2位

眼下,方法如下:

formatter(timeInMilliseconds) { 
    const padZero = (time) => { 
    while (time.length < 2) { 
     time = '0' + time; 
    } 
    return time; 
    } 

    let time = new Date(timeInMilliseconds); 
    let minutes = padZero(time.getMinutes().toString()); 
    let seconds = padZero(time.getSeconds().toString()); 
    let milliseconds = padZero((time.getMilliseconds()/10).toFixed(0)); 

    let output = `${minutes} : ${seconds} . ${milliseconds}`; 
    console.log(output); 
    return output; 
} 

在大多數情況下,它的工作原理。如果在定時器運行時查看JSFiddle的控制檯,問題很明顯。例如,如果秒錶目前處於00 : 15 . 99之類的狀態,則將在下一次打勾時變爲00 : 15 . 100,而不是00 : 16 . 00

任何幫助,將不勝感激。

+0

我將不勝感激,如果我給了改善我的問題,而不是給予downvotes的建議。 – saadq

回答

3

toFixed回合,而不是截斷,因此995毫秒,最高將成爲99.5和toFixed被格式化爲100。你可以把它轉換爲整數,然後字符串而不是截斷它:

let milliseconds = padZero('' + (time.getMilliseconds()/10 | 0)); 

它也可能是一個很好的簡化,使padZero接受一個數字,而不是字符串:

function padZero(time) { 
    return time < 10 ? '0' + time : '' + time; 
} 

let time = new Date(timeInMilliseconds); 
let minutes = padZero(time.getMinutes()); 
let seconds = padZero(time.getSeconds()); 
let milliseconds = padZero(time.getMilliseconds()/10 | 0); 

let output = `${minutes} : ${seconds} . ${milliseconds}`; 

最後,如果timeInMilliseconds自1970-01-01 00:00:00 UTC以來不是以毫秒爲單位的時間戳,而是持續時間,則不適宜將其轉換爲Date。只是做一些數學:

const minutes = padZero(timeInMilliseconds/60000 | 0); 
const seconds = padZero((timeInMilliseconds/1000 | 0) % 60); 
const centiseconds = padZero((timeInMilliseconds/10 | 0) % 100); 
+0

Upvoted,謝謝。由於涉及的轉換較少,我將與Joshua一起回答,但我感謝您花時間回答! – saadq

+0

@meh_programmer:我的榮幸!順便說一句,我希望「少轉換」是關於可讀性而不是性能,因爲它的可讀性更重要。 (這和'| 0'比'Math.floor'快,'toFixed'對字符串的轉換速度還是比較慢。) – Ryan

+0

是的,它是關於可讀性的,但是我想我會在設計之後所有。我真的很感謝你對此做得如此透徹,並且展示了一個更好/更準確的方法來做到這一點。謝謝! – saadq

0

您可以使用子()

let milliseconds = padZero((time.getMilliseconds()/10).toFixed(0)).substr(0, 2); 
+0

這不會修復分鐘部分。 – saadq

+0

我會編輯我的答案。 – GAntoine

+0

我很尋找不同的方式來做到這一點。我知道我只需要一個毫秒的子字符串並手動更新分鐘部分,但對我來說這似乎很難。 – saadq

2

你的問題是,.toFixed()輪而不是截斷。

(99.4).toFixed(0) == '99' 
(99.5).toFixed(0) == '100' 

所有你需要做的是與

Math.floor(time.getMilliseconds()/10).toFixed(0) 

更換

(time.getMilliseconds()/10).toFixed(0) 

,它會工作。