Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript getHours()返回的值不正确_Javascript_Date_Formatting - Fatal编程技术网

Javascript getHours()返回的值不正确

Javascript getHours()返回的值不正确,javascript,date,formatting,Javascript,Date,Formatting,我使用JavaScript日期对象将毫秒转换为可读的minutes:seconds格式字符串。我需要它来为自定义视频播放器创建一个计时器,我的JS接口将视频持续时间信息作为毫秒值接收 在我决定支持视频长度超过59分钟的可能性之前,这是一项相当简单的任务。然后我遇到了这个问题:当我向新Date对象的构造函数提交一个毫秒值,然后调用getHours(),它将返回一些内容,即使毫秒数代表的时间段小于一小时。查看此操作的最简单方法是为其输入,例如0 我希望它返回0,但它总是返回12(在Opera中是1

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

在我决定支持视频长度超过59分钟的可能性之前,这是一项相当简单的任务。然后我遇到了这个问题:当我向新Date对象的构造函数提交一个毫秒值,然后调用
getHours()
,它将返回一些内容,即使毫秒数代表的时间段小于一小时。查看此操作的最简单方法是为其输入,例如0

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

谢谢

UPD:

我已经在OSX上的Chrome15和Firefox7上测试过了:结果与上面的截图相同。我不知道如何使用Opera Dragonfly控制台,但从我看到的Opera中也发生了同样的事情,只是
getHours()

尝试调用
新日期(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;      
};
var-toTimeString=函数(秒){
var天、小时、分钟、秒;
如果(秒==null)
返回“”;
天数=(秒/86400)>>0;
小时=(秒%86400/3600)>>0;
分钟=(秒%3600/60)>>0;
秒=(秒%60);
秒=秒<10?“0”+秒:秒;
分钟=分钟<10?“0”+分钟:分钟;
小时数=小时数和小时数<10?“0”+小时数:小时数;
返回“+(天-天+”-“:”)+(小时-小时+“:”)+分钟+“:”+秒;
};

根据需要应用自定义格式。。这实际上需要几秒钟,所以将毫秒除以1000得到秒。

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

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

我知道你不是在问这个问题,得到的答案不能解决你的问题,这很烦人,但在这种情况下。。。在你使用JS的原生Date()对象进行大量工作之前,我强烈建议你先切换到Datejs。这个对象功能不太强大,可能会带来很多麻烦,特别是当你必须规范时区的时候!

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


如果需要增加到天,您仍然会遇到问题,但是在此之前,Date原语对于您使用它的目的来说可以正常工作。

您不想在这里使用
Date
构造函数
newdate(n)
返回一个
Date
对象,其日期设置为1970年1月1日+
n
毫秒,这肯定不是您想要的…@ŠimeVidas,那么有什么好的替代方法呢?给您:@ŠimeVidas,这非常棒、简单且可靠。非常感谢。我对它进行了一些重构。。。对,时区。我在新西兰,所以这就是为什么在我的例子中,0加12小时。我从没想过,谢谢!虽然它并没有解决问题,但它只是表明这种方法实际上是多么不可靠……那将是1900年2月1日。月份是以零为基础的,例如一月是月
0
@gilly3很好,我忘了。无论如何,日期有点随意。在这种情况下,时间是很重要的。感谢这一点,GetUTCHours解决了我的类似问题,而不需要任何其他手段。这应该是答案。解决了我的问题,这和最初的“asker”一样。你让我再次登录github只是为了给你投票。这就是精神。完美的行为。