getHours()返回不正确的值

时间:2011-11-15 00:02:12

标签: javascript date formatting

我使用JavaScript Date对象将毫秒转换为可读minutes:seconds格式的字符串。我需要为自定义视频播放器创建一个计时器,我的JS接口以毫秒值的形式接收视频持续时间信息。

在我决定支持视频超过59分钟的可能性之前,这是一项相当简单的任务。然后我遇到了这个问题:当我向新的Date对象的构造函数提交一个毫秒值,然后调用getHours()时,即使毫秒数代表不到一小时的时间段,它也会返回一些东西。最简单的方法就是提供它,比如0。

enter image description here

我希望它返回0,但它总是返回12(Opera中的13,这使得它更奇怪)。这是正常行为还是错误?无论哪种方式,我如何可靠地检测我的毫秒值是否仅限于几分钟或几秒还是包括几小时?

感谢。

UPD:

我在OSX上的Chrome 15和Firefox 7中测试过它:与上面截图相同的结果。我无法弄清楚如何使用Opera Dragonfly控制台,但从我看到的相同的事情发生在Opera中,只有getHours()的值为13。

4 个答案:

答案 0 :(得分:22)

我注意到,虽然人们告诉用户如何修复他的代码,但他们没有告诉他如何做他所要求的。答案很简单。不要使用函数getHours()。使用getUTCHours()。这将绕过任何时区偏移。

如果你需要上几天,你仍然会遇到问题,但是在那之前,Date原语对于你用它的东西会很好。

答案 1 :(得分: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得到秒。

答案 2 :(得分:2)

我知道你不是要求这个,而且得到的答案并不能解决你的问题很烦人,但在这种情况下...我会认真地建议在做大量工作之前切换到Datejs JS的原生Date()对象并不过分强大,可能会造成许多麻烦,特别是如果你必须规范化时区! http://www.datejs.com/

答案 3 :(得分:0)

请尝试指定年,月,日,小时,分钟,秒和毫秒值:

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