2011-11-15 72 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