2011-11-15 15 views
5

Używam obiektu Data JavaScript do konwertowania milisekund na czytelny formatowany ciąg znaków minutes:seconds. Potrzebuję tego, aby utworzyć zegar dla niestandardowego odtwarzacza wideo, w którym mój interfejs JS odbiera informacje o czasie trwania filmu w postaci milisekundy.getHours() zwracająca niepoprawną wartość

To było dość trywialne zadanie, zanim zdecydowałem się poprzeć możliwość filmowania dłuższego niż 59 minut. I wtedy napotkałem ten problem: kiedy przesyłam wartość milisekundy do konstruktora nowego obiektu Date, a następnie wywołuję getHours(), to on zwróci coś, nawet jeśli liczba milisekund oznacza okres czasu krótszy niż godzina. Najprostszym sposobem, aby zobaczyć w akcji jest, aby go nakarmić, powiedzmy, 0.

enter image description here

będę oczekiwać, że zwraca 0, ale zawsze wraca 12 (13 w Operze, co czyni go jeszcze bardziej dziwne). Czy to normalne zachowanie, czy jest to błąd? Tak czy inaczej, w jaki sposób mogę niezawodnie wykryć, czy moja wartość milisekundy jest ograniczona do minut i sekund, czy też obejmuje godziny?

Dzięki.

UPD:

Przetestowałem go w Chrome 15 i Firefox 7 na OSX: sam wynik, jak na powyższym zrzucie ekranu. Nie wiem, jak korzystać z konsoli Opera Dragonfly, ale z tego, co widzę, dzieje się w Operze, o wartości 13 dla getHours().

+0

Nie chcesz używać tutaj konstruktora 'Date'. 'new Date (n)' zwraca obiekt 'Date' z datą ustawioną na 1 stycznia 1970 +' n' milisekund, co z pewnością nie jest tym, czego potrzebujesz ... –

+0

@ ŠimeVidas, więc jaka byłaby dobra alternatywa? – Arnold

+0

Napisałbym swoją własną funkcję. –

Odpowiedz

7

Spróbuj zadzwonić pod numer new Date(0).toString() i sprawdzić, czy ma to wpływ na strefę czasową?

Kopalnia daje

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

Ponieważ jestem na GMT + 2, więc getHours daje 2 do mnie.

Unix epoka to GMT + 0

Zastosowanie +new Date aby uzyskać wiarygodne milisekund w danym momencie i zachować je jako liczby. Nie rób żadnej matematyki w obrębie obiektu daty rzeczywistej.

Oto co użyłem:

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;  
}; 

Zastosuj niestandardowe formatowanie wymagane .. To rzeczywiście trwa sekundy więc podzielić przez 1000 milisekund, aby uzyskać sekund.

+0

Prawo, strefa czasowa. Jestem w Nowej Zelandii, dlatego w moim przypadku dodaje 12 godzin do 0. Nigdy by o tym nie pomyślałem, wielkie dzięki! Chociaż nie rozwiązuje problemu, pokazuje tylko, jak niewiarygodne jest to podejście ... – Arnold

0

Spróbuj określając wartość rok, miesiąc, dzień, godziny, minuty, sekundy i milisekund zamiast:

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

To byłby 1 lutego 1900. Miesiące są oparte na zera, np. Styczeń to miesiąc '0'. – gilly3

+0

@ gilly3 Dobra uwaga, zapomniałem o tym. W każdym razie data jest nieco arbitralna. To jest czas, który jest ważny w tym przypadku. – GregL

2

wiem, że nie pytasz o to, i to jest denerwujące, aby uzyskać odpowiedzi, że nie dzieje odpowiedzieć na twoje pytanie, ale w tym przypadku ... Z poważaniem zaleciłbym przełączenie się na Datejs, zanim wykonasz wiele pracy przy użyciu oryginalnego obiektu Date() JS, który nie jest zbyt mocny i może być źródłem wielu problemów, szczególnie jeśli musisz normalizować strefy czasowe! http://www.datejs.com/

13

Zauważam, że chociaż ludzie poinformowali użytkownika o tym, jak naprawić jego kod, nie poinformowali go, jak zrobić to, o co prosił. Odpowiedź jest dość prosta. Nie używaj funkcji getHours(). Użyj metody getUTCHours(). Spowoduje to obejście dowolnego przesunięcia strefy czasowej.

Wciąż będziesz mieć problemy, jeśli będziesz potrzebować nawet kilku dni, ale do tego czasu prymityw Date będzie działał dobrze dla tego, do czego go użyjesz.

+0

Dzięki za to GetUTCHours naprawił mój podobny problem bez potrzeby stosowania innych oszustw. – fubeca

Powiązane problemy