2011-11-15 3 views
5

JavaScript Date 객체를 사용하여 밀리 초를 읽을 수있는 minutes:seconds 형식의 문자열로 변환하고 있습니다. 내 JS 인터페이스가 밀리 초 값으로 비디오 재생 시간 정보를받는 사용자 정의 비디오 플레이어 용 타이머를 만드는 데 필요합니다.잘못된 값을 반환하는 getHours()

비디오를 59 분 이상 보낼 가능성을 지원하기에 앞서 아주 간단한 작업이었습니다. 그리고 나서이 문제가 발생했습니다 : 새 Date 객체의 생성자에 밀리 초 값을 제출하고 getHours()을 호출하면 milliseconds 수가 1 시간 미만인 경우에도 무언가가 반환됩니다. 행동에서 볼 수있는 가장 쉬운 방법은, 말하자면, 그것을 공급하는 것입니다 0

enter image description here

나는 그것이 0을 반환하는 기대하지만, 항상 더 그것을 만드는, 12 (오페라 13을 반환 기묘한). 이것은 정상적인 행동입니까, 아니면 버그입니까? 어느 쪽이든, 밀리 초 값이 단 몇 분 또는 몇 초로 제한되는지 또는 시간을 포함하는지 여부를 안정적으로 감지하는 방법은 무엇입니까?

감사합니다.

UPD :

내가 OSX에 크롬 15, 파이어 폭스 7에서 테스트했습니다 같은 결과를 위의 스크린 샷에 따라. Opera Dragonfly 콘솔을 사용하는 방법을 알 수는 없지만 오페라에서 똑같은 것을 볼 수 있습니다. getHours()의 값은 13입니다.

+0

여기서 '날짜'생성자를 사용하고 싶지는 않습니다. 'new Date (n)'은 날짜가 1970 년 1 월 1 일 +'n' 밀리 초로 설정된'Date' 객체를 반환합니다. 이것은 확실히 당신이 원하는 것이 아닙니다 ... –

+0

@ ŠimeVidas, 그래서 좋은 대안이 될까요? – Arnold

+0

내 자신의 기능을 쓸 수 있습니다. –

답변

7

new Date(0).toString()으로 전화를 걸어 영향을받는 표준 시간대가 있는지 확인하십시오.

광산은 너무 getHours 나에게 2를 제공,

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

내가 GMT + 2니까

을 제공합니다.

유닉스 시대는 시점에서 신뢰할 수 밀리 초를 얻을 수로 유지하기 위해 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 일이 될 것입니다. 개월은 0부터 시작합니다. 예를 들어 1 월은 0 월입니다. – gilly3

+0

@ gilly3 좋은 지적, 나는 그것을 잊었다. 어쨌든 날짜는 다소 임의적입니다. 이 경우 중요한시기입니다. – GregL

2

난 당신이 요청하지 않는 알고, 그것을하지 않는 답을 얻기 위해서 짜증나 귀하의 질문에 대답하지만,이 경우에는 ... 나는 심각하게 많은 힘든 일이 아니고 많은 문제의 원인이 될 수있는 JS의 기본 Date() 객체로 많은 일을하기 전에 Datejs로 전환하는 것이 좋습니다. 특히 시간대를 표준화해야합니다! http://www.datejs.com/

13

사람들이 코드를 수정하는 방법을 사용자에게 알리는 동안 사용자는 자신이 작성한 코드를 수행하는 방법을 알리지 못했습니다. 대답은 꽤 간단합니다. getHours() 함수를 사용하지 마십시오. getUTCHours()를 사용하십시오. 이렇게하면 모든 시간대 오프셋이 무시됩니다.

며칠까지 갈 필요가있는 경우에도 문제는 계속 발생하지만 그때까지는 Date 프리미티브가 사용하는 용도로만 정상적으로 작동합니다.

+0

감사합니다. GetUTCHours는 다른 속임수가 필요없이 비슷한 문제를 해결했습니다. – fubeca

관련 문제