Non fare affidamento sul costruttore di JavaScript Date
per analizzare una stringa. Il comportamento e i formati supportati variano notevolmente per browser e impostazioni internazionali. Here sono solo alcuni dei comportamenti predefiniti se si utilizza direttamente l'oggetto Date
.
Se è necessario provenire da una stringa, provare a utilizzare un formato standardizzato come ISO8601. La data che hai dato in quel formato sarebbe "2012-06-25T12:00:00"
. Il modo più semplice per lavorare con questi in JavaScript è con moment.js.
Inoltre, fate attenzione a ciò che intendete effettivamente rappresentare. In questo momento, stai passando una data/ora locale, salvando una/data/ora locale e restituendo una data/ora locale. Lungo la strada, l'idea di ciò che è "locale" potrebbe cambiare.
In molti casi, la data/ora è destinata a rappresentare un esatto momento nel tempo. Per farlo funzionare, è necessario convertire dall'ora locale immessa in UTC sul client. Invia UTC al tuo server e memorizzalo. Successivamente, recuperare UTC e inviarlo al client, elaborarlo come UTC e riconvertire in ora locale. Si può fare tutto questo facilmente con moment.js:
// I'll assume these are the inputs you have. Adjust accordingly.
var dateString = "6-25-2012";
var timeString = "12:00:00 PM";
// Construct a moment in the default local time zone, using a specific format.
var m = moment(dateString + " " + timeString, "M-D-YYYY h:mm:ss A");
// Get the value in UTC as an ISO8601 formatted string
var utc = m.toISOString(); // output: "2012-06-25T19:00:00.000Z"
Sul server in .Net:
var dt = DateTime.Parse("2012-06-25T19:00:00.000Z", // from the input variable
CultureInfo.InvariantCulture, // recommended for ISO
DateTimeStyles.RoundtripKind) // honor the Z for UTC kind
Conservare che nel database. Più tardi recuperarlo e rinviarlo:
// when you pull it from your database, set it to UTC kind
var dt = DateTime.SpecifyKind((DateTime)reader["yourfield"], DateTimeKind.Utc);
// send it back in ISO format:
var s = dt.ToString("o"); // "o" is the ISO8601 "round-trip" pattern.
Passo di nuovo al javascript in moment.js:
// construct a moment:
var m = moment("2012-06-25T19:00:00.000Z"); // use the value from the server
// display it in this user's local time zone, in whatever format you want
var s = m.format("LLL"); // "June 25 2012 12:00 PM"
// or if you need a Date object
var dt = m.toDate();
Sede - che era facile, e non hai bisogno di entrare in qualcosa di fantasia con fusi orari.
Si potrebbe preferire gestire la data come un numero di secondi d.getTime()/1000 che può essere facilmente convertita fino ad oggi utilizzando la maggior parte delle lingue. – Serge
Ok, ma se la data originale è costruita partendo da parti di stringhe (due controlli diversi, uno da un selettore di date, l'altro al time picker), ancora una volta come faccio a dire alla data di JavaScript che costruisco in che fuso orario è, altrimenti il d.getTime()/1000 sarà fatto contro il tempo che gli ho dato, meno le 4 ore. – brushleaf
Hai eseguito test con fuso orario diverso per assicurarti che il problema provenisse da lì e non dalla conversione? – Serge