2011-11-15 73 views
5

我正在使用JavaScript Date對象將毫秒轉換爲可讀的minutes:seconds格式化字符串。我需要爲自定義視頻播放器創建一個定時器,其中我的JS界面將視頻持續時間信息接收爲毫秒值。getHours()返回不正確的值

在我決定支持超過59分鐘的視頻的可能性之前,這是一項相當平凡的任務。然後我遇到了這個問題:當我向新的Date對象的構造函數提交一個毫秒值,然後調用getHours()時,即使毫秒數表示一段時間少於一個小時,它也會返回一些值。看到這個動作最簡單的方法是給它餵食,比方說,0

enter image description here

我希望它返回0,但它總是返回12(13歌劇,這使得它更奇怪的)。這是一個正常的行爲還是一個錯誤?無論哪種方式,我如何可靠地檢測出我的毫秒值是僅限於分鐘和秒還是還包括小時?

謝謝。

UPD:

我測試它在Chrome 15和Firefox 7上OSX:相同的結果根據上面的屏幕截圖。我無法弄清楚如何使用Opera Dragonfly控制檯,但是從我看到的相同的事情發生在Opera中,只有值爲13的getHours()

+0

你不想在這裏使用'Date'構造函數。 'new Date(n)'返回一個日期對象,日期設置爲1970年1月1日+ n毫秒,這肯定不是你想要的... –

+0

@ŠimeVidas,那麼什麼是好的選擇? – Arnold

+0

我會寫我自己的功能。 –

回答

7

嘗試調用new Date(0).toString()並查看是否存在影響它的時區?

礦給

"Thu Jan 01 1970 02:00:00 GMT+0200 (FLE Standard Time)" 

因爲我是在GMT + 2,因此getHours給2給我。

Unix紀元是GMT + 0

使用+new Date在某個時間點獲得可靠毫秒,並將其作爲數字。不要在實際的日期對象中做任何數學運算。

這裏是我曾經用過什麼:

var toTimeString = function(secs) { 
var days, hours, minutes, seconds; 

    if(secs == null) 
    return ""; 

days = (secs/86400) >> 0; 
hours = (secs % 86400/3600) >> 0; 
minutes = (secs % 3600/60) >> 0; 
seconds = (secs % 60);  
seconds = seconds < 10 ? "0" + seconds : seconds; 
minutes = minutes < 10 ? "0" + minutes : minutes; 
hours = hours && hours < 10 ? "0" + hours : hours; 

return "" + (days ? days+" - " : "") + (hours ? hours+":" : "") + minutes + ":" + seconds;  
}; 

應用自定義格式的要求。這實際上只需幾秒鐘所以除以1000毫秒獲得秒。

+0

權利,時區。我在新西蘭,所以這就是爲什麼在我的情況下,它增加了12小時0。永遠不會想到這一點,非常感謝!雖然它不能解決問題,但它只是表明這種方法實際上是多麼不可靠...... – Arnold

0

嘗試指定的年,月,日,時,分,秒和毫秒值,而不是:

var sampleTime = new Date(1900,1,1,0,0,0,0); 
+1

那將是1900年2月1日。月份基於零,例如1月份是月份'0'。 – gilly3

+0

@ gilly3好點,我忘記了。無論如何,這個日期有點武斷。在這種情況下,重要的是時間。 – GregL

2

我知道你不是要求這一點,這很煩人得到不回答解決你的問題,但在這種情況下...我會認真地建議切換到Datejs,然後再用JS的本地Date()對象進行大量工作,但它並不過分強大,並且可能成爲很多麻煩的源頭,尤其是如果你必須規範時區! http://www.datejs.com/

13

我注意到,當人們告訴用戶如何修復他的代碼時,他們沒有通知他如何去做他所要求的。答案很簡單。不要使用函數getHours()。使用getUTCHours()。這將繞過任何時區偏移量。

如果你需要花費幾天的時間,你仍然會遇到問題,但是在那之前,Date原語對於你所用的東西來說工作得很好。

+0

非常感謝,GetUTCHours修復了我的類似問題,而不需要其他任何欺騙。 – fubeca