2013-05-20 4 views
5

Ho due variabili:conversione da millisecondi a Unix Timestamp da tempi diversi spedisce stesso risultato

tempTimeRequests timeLastUpdateRequests

Entrambi sono indicati tra millisecondi dalla epoca.

sto affrontando un comportamento bizzarro da js:

il risultato che ottengo per

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

è

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

Come mai non ho lo stesso valore di secondi se abbia chiaramente 51 secondi per il secondo (che dà il risultato giusto) ma 65 (che darebbe 05 secondi) per il primo? Sono davvero impazzito con quello.

+1

È strano. Quando li stampo separatamente (usando 'console.log' ciascuno), ottengo i valori corretti. Quando li unisco in una chiamata 'console.log', mostrano lo stesso valore (ovviamente lo stesso per' alert') – Ian

+2

Se si usa 'new Date (', sembra funzionare per me – Ian

+2

Da MDN: "chiamandolo come una funzione regolare (cioè senza il 'new'operator) restituirà una stringa piuttosto che un oggetto' Date'; ".Questo sembra essere perfettamente soddisfacente. Anche da ES5: http://es5.github.io/# x15.9.2 – Ian

risposta

4

chiamando il costruttore Date in funzione restituisce la corrente data di .

Dal specification

15.9.2 La Data di costruzione chiamata come una funzione

Quando Data viene chiamata come una funzione piuttosto che come un costruttore, restituisce una stringa che rappresenta la corrente time (UTC).

NOTA La funzione di chiamata Date(…) è non equivalente all'espressione creazione dell'oggetto new Date(…) gli stessi argomenti.

Questo è diverso quando si utilizza new Date che fa ciò che si aspetta.

+1

Ottima spiegazione. Grazie, ho provato a trovarlo quando ho dato la mia risposta. – Robbert

+0

@Robbert Non sono io, sono le specifiche del linguaggio :) Si sta facendo un grande sforzo attivo per rendere le specifiche del linguaggio ECMAScript più leggibili e accessibili. http://es5.github.com getta anche in una facile navigazione e link a risorse come MDN. –

+0

@Benjamin Gruenbaum Grazie mille! – DanielX2010

3

Questo dovrebbe risolvere il problema

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

OK, ma questo non spiega perché chiamare 'Date()' da solo esponga questo tipo di comportamento.Si tratta di un bug? –

+0

Non sono sicuro del motivo per cui lo fa, a parte il fatto che Date è un oggetto e per creare un oggetto, si utilizza la nuova parola chiave. Il modo in cui lo chiamavi era come una funzione, che forse alcuni browser supportano ma altri no. – Robbert

+0

Suppongo che lo faccia perché quando viene eseguito da Javascript valuta le funzioni 'Date (ora)' prima assegnandole alla prima volta n la seconda volta, quindi, quando si costruisce la stringa su 'alert', l'oggetto' Date' diventa una stringa che a quel punto verrebbe impostata alla seconda volta. – Shaded