2013-07-19 16 views
15

Quindi ho tempo di data iso che deve essere convertito da una stringa in un oggetto data. Come faccio a mantenere la data dalla conversione nel fuso orario del browser locale.Interrompi javascript Funzione data dalla modifica dell'offset del fuso orario

new Date('2013-07-18T17:00:00-05:00') 
Thu Jul 18 2013 18:00:00 GMT-0400 (EDT) 

voglio ottenere

gio lug 18, 2013 17:00:00 GMT-0500 (XX)

+1

Il punto delle date formattate ISO deve essere riconvertito nel fuso orario ... – SeinopSys

+1

Non è possibile. L'oggetto 'Data' JavaScript non memorizza alcuna informazione sul fuso orario, e quando si esegue l'output/toStringing/logging useranno il fuso orario del browser locale (purtroppo predefinito) o UTC (con metodi espliciti). – Bergi

+0

Ma cosa succede se quello che sto cercando di visualizzare non è nel fuso orario del browser. Perché non datare la stringa di analisi e impostare l'oggetto data sull'offset fuso orario specificato nella stringa iso. – user2434674

risposta

0

chiedo se questo potrebbe aiutare:

function goAheadMakeMyDate(s){ 
    var d = new Date(s); 
    // override Date.toString() 
    d.toString = function(){ return ''+s; }; 
    return d; 
} 

var example = goAheadMakeMyDate("Fri 19 July 2013 12:00:00 GMT"); 

example.toString() // returns string actually used to construct the date 
'Fri 19 July 2013 12:00:00 GMT' 

example.toLocaleString() 
'Fri Jul 19 2013 08:00:00 GMT-0400 (EDT)' 

1*example // gives seconds since epoch 
1374235200000 

Con il tuo contributo :

example = goAheadMakeMyDate('2013-07-18T17:00:00-05:00') 
{ Thu, 18 Jul 2013 22:00:00 GMT toString: [Function] } 
> example.toString() 
'2013-07-18T17:00:00-05:00' 
> example.toLocaleString() // I live in GMT-4 
'Thu Jul 18 2013 18:00:00 GMT-0400 (EDT)' 
> 1*example // convert to integer date 
1374184800000 

Tuttavia, se si inizia a modificare questa data, il toString sostituirà non e ti morderà.

+0

Questo ha reso la mia data :-) Ma non funzionerà quando l'oggetto data viene modificato (da 'setHour' o qualcosa). – Bergi

+1

Ma hai sparato 5 colpi o era il tuo 6 °? In realtà, fare ciò correttamente probabilmente richiederebbe duplicare tutto ciò che la data comporterà ... – Paul

-2

Se si è aperti all'utilizzo di una libreria, la libreria JavaScript MomentJS è popolare per la gestione di orari e date.

+2

Dovrebbe mostrare come esattamente il momentojs può essere usato per rispondere alla domanda invece di puntare semplicemente a un link. – Seph

1

Per eseguire questa operazione è possibile utilizzare una libreria come Moment.js.

Vedere la stringa + Formato di parsing.

http://momentjs.com/docs/#/parsing/string-format/

Il seguente dovrebbe analizzare la data che hai fornito, ma potrebbe essere necessario modificarlo per le vostre esigenze.

var dateString = "2013-07-18T17:00:00-05:00"; 

var dateObject = moment(dateString, "YYYY-MM-DDTHH:mm:ssZ").toDate(); 

In alternativa, vedi String parser del momento, che sembra che sia nel formato che hai fornito, con l'eccezione di uno spazio tra i secondi del tempo e il fuso orario.

http://momentjs.com/docs/#/parsing/string/

2

Non è possibile modificare questo comportamento di Javascript, perché è l'unico modo semplice per JavaScript. Quello che succede è semplicemente che Javascript guarda il time shift, calcola il timestamp corrispondente, e poi chiede al sistema operativo la rappresentazione di questo timestamp nel fuso orario locale. La chiave per capire qui è che -05:00 non è un'indicazione del fuso orario ma semplicemente uno spostamento da UTC.

I fusi orari sono animali complessi che sono solo decisioni politiche arbitrarie. Il sistema operativo fornisce un servizio per visualizzare l'ora nel fuso orario locale, ma non in altri fusi orari. Per farlo devi prendere in considerazione cose come la DST che sono praticamente un inferno.

Come sempre con la gestione del tempo, l'unico modo decente per affrontare questo problema è utilizzare una libreria dedicata. In Javascript, troverai Moment.js e Moment.Timezone.js molto utili.

Esempio http://codepen.io/Xowap/pen/XKpKZb?editors=0010

document.write(moment('2013-07-18T17:00:00-05:00').tz('America/New_York').format('LLL')); 

Come bonus, si ottiene una tonnellata di formattazione/parsing caratteristiche da Moment.js.

Si prega di notare che finché si utilizza la ISO 8601, la data può essere individuata in un momento preciso, e quindi essere visualizzata in qualsiasi fuso orario di vostro gradimento. In altre parole, JS "convertire" la tua data non ha importanza.

Problemi correlati