2013-05-20 11 views
5

Mam dwie zmienne:konwersji od milisekund do uniksowy znacznik czasu z różnych czasach daje taki sam wynik

tempTimeRequests timeLastUpdateRequests

Oba są podane w milisekundach od epoki.

jestem obliczu dziwaczne zachowanie od JS:

również wynik mam dla

alert(
    tempTimeRequests+"\n"+ 
    timeLastUpdateRequests+"\n"+ 
    Date(tempTimeRequests)+"\n"+ 
    Date(timeLastUpdateRequests) 
) 

jest

1369063665000 
1369063651000 
Mon May 20 2013 17:27:51 GMT+0200 (CEST) 
Mon May 20 2013 17:27:51 GMT+0200 (CEST) 

Jak to mam taką samą wartość w sekundach, jeśli mają wyraźnie 51 sekund na sekundę (co daje właściwy wynik), ale 65 (co dałoby 05 sekund) na pierwszy? Naprawdę to przerażam.

+1

To dziwne. Kiedy wydrukuję je osobno (przy użyciu każdego z plików 'console.log'), otrzymam poprawne wartości. Kiedy łączę je w jedno wywołanie 'console.log', pokazują one tę samą wartość (oczywiście to samo dla' alertu '). – Ian

+2

Jeśli używasz 'nowej daty (', to wydaje mi się, że działa dla mnie – Ian

+2

Z MDN: "wywołanie go jako funkcja regularna (tj. bez 'nowego'operatora) zwróci ciąg znaków, a nie obiekt' Date' ;, więc wydaje się, że jest on zupełnie niezły.Tak też z ES5: http://es5.github.io/# x15.9.2 – Ian

Odpowiedz

4

Wywołanie konstruktora Date jako funkcja zwraca aktualny datę.

Z specification

15.9.2 Date Constructor wywoływana jako funkcja

Kiedy Data nazywany jest jako funkcja raczej niż jako konstruktor, zwraca łańcuch znaków reprezentujący prąd czas (UTC).

UWAGA Funkcja połączeń Date(…) jest nie równoznaczne z wyrażeniem tworzenia obiektów new Date(…) z tymi samymi argumentami.

Jest to niepodobne w przypadku korzystania z new Date, które spełnia wszystkie oczekiwania.

+1

Świetne wyjaśnienie. Dzięki, próbowałem to znaleźć, gdy dałem odpowiedź. – Robbert

+0

@Robbert To nie ja, to jest specyfikacja językowa :) Włożyliśmy dużo wysiłku, aby specyfikacja języka ECMAScript stała się bardziej czytelna i dostępna. http://es5.github.com również ułatwia nawigację i linki do zasobów takich jak MDN. –

+0

@Benjamin Gruenbaum Wielkie dzięki! – DanielX2010

3

To powinno rozwiązać problem

alert(
    tempTimeRequests+"\n"+ 
    timeLastUpdateRequests+"\n"+ 
    new Date(tempTimeRequests)+"\n"+ 
    new Date(timeLastUpdateRequests) 
) 
+1

OK, ale to nie wyjaśnia, dlaczego samo wywoływanie 'Date()' powoduje takie zachowanie.Jest to błąd? –

+0

Nie jestem pewien, dlaczego to robi, oprócz faktu, że Data jest obiekt i aby utworzyć obiekt, użyjesz nowego słowa kluczowego. Sposób, w jaki go wywoływałeś, używał go jako funkcji, którą być może niektóre przeglądarki obsługują, ale inne nie. – Robbert

+0

Domyślam się, że to robi, ponieważ kiedy JavaScript go uruchamia ocenia funkcje "Data (czas)" najpierw przypisując je po raz pierwszy n po raz drugi, a następnie podczas konstruowania napisu "alert" otrzymuje obiekt "Date" jako ciąg znaków, który w tym czasie zostanie ustawiony po raz drugi. – Shaded

Powiązane problemy