Data JavaScript per C # via Ajax

Ho un object data javascript che mi dà una stringa di data in questo formato, “Wed Dic 16 00:00:00 UTC-0400 2009”.

Ho passato questo tramite Ajax al server (ASP.NET c #)

Come posso convertire “Wed Dic 16 00:00:00 UTC-0400 2009” in un object Date # C #. DateTime.Parse non riesce.

È ansible utilizzare DateTime.ParseExact che consente di specificare una stringa di formato da utilizzare per l’analisi:

DateTime dt = DateTime.ParseExact("Wed Dec 16 00:00:00 UTC-0400 2009", "ddd MMM d HH:mm:ss UTCzzzzz yyyy", CultureInfo.InvariantCulture); 

Il modo più affidabile sarebbe utilizzare millisecondi dall’epoca. Puoi facilmente ottenere questo in JavaScript chiamando Date.getTime() . Quindi, in C # puoi convertirlo in un DateTime come questo:

 long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript return new DateTime(1970, 1, 1).AddTicks(msSinceEpoch * 10000); 

Devi moltiplicare per 10.000 per convertire da millisecondi a “tick”, che sono 100 nanosecondi.

Questo potrebbe non essere ansible nel tuo caso, ma consiglio davvero di aggiornare il codice JS per passare date / ore nel formato ISO 8601. http://en.wikipedia.org/wiki/ISO_8601

ISO 8601 non è solo lo standard formale, è anche facile da usare e previene un sacco di problemi di fuso orario!

Per ottenere 8601 stringhe datetime in Javascript:

 var d = new Date(); var iso_time = d.toISOString(); //"2014-05-06T18:49:16.029Z" 

Per leggere le stringhe datetime 8601 in C #:

 DateTime d = DateTime.Parse(json_string); 

Solo per i posteri, per aiutare i futuri compagni di Googler, mi piacerebbe espandere la risposta di EMP.

La risposta di EMP fornisce il tempo in UTC (se è quello che stai cercando, usa quello).

Per arrivare all’ora locale del cliente in C #:

In JavaScript:

  var now = new Date(); var UTC = now.getTime(); var localOffset = (-1) * now.getTimezoneOffset() * 60000; var currentTime = Math.round(new Date(UTC + localOffset).getTime()); 

In C #:

  DateTime currentTimeDotNet = new DateTime(1970, 1, 1).AddTicks(Convert.ToInt64(currentTime) * 10000); 

Ringraziamo questo blog e la risposta di EMP, ma ho preso alcune prove ed errori su entrambe le estremità per farlo bene, quindi basta fyi per gente del futuro.

Ad essere sincero, non proverei ad analizzare quella stringa data in C #, proverei personalmente a creare una struttura data più utile dal tuo object data javascript.

Ad esempio, è ansible utilizzare parse() in javascript che restituirà il ms che rappresenta l’object data, che è ansible utilizzare DateTime.Parse() per convertirlo in un object DateTime C #.