Data de Javascript para C # via Ajax

Eu tenho javascript data object que me dá uma seqüência de data neste formato, “Qua Dez 16 00:00:00 UTC-0400 2009”.

Eu passo isso via Ajax para o servidor (ASP.NET c #)

Como posso converter, “Qua Dez 16 00:00:00 UTC-0400 2009” para um object DateTime C #. DateTime.Parse falha.

Você pode usar DateTime.ParseExact, que permite especificar uma string de formato a ser usada para análise:

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

A maneira mais confiável seria usar milissegundos desde a época. Você pode facilmente obter isso em JavaScript chamando Date.getTime() . Então, em C # você pode convertê-lo em um DateTime assim:

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

Você tem que multiplicar por 10.000 para converter de milissegundos para “ticks”, que são 100 nanossegundos.

Isso pode não ser possível no seu caso, mas eu realmente recomendo atualizar o código JS para passar datas / horas no formato ISO 8601. http://en.wikipedia.org/wiki/ISO_8601

O ISO 8601 não é apenas o padrão formal, também é fácil de usar e evita muitos problemas de fuso horário!

Para obter 8601 cadeias de data / hora em JavaScript:

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

Para ler 8601 cadeias de data / hora em c #:

 DateTime d = DateTime.Parse(json_string); 

Apenas para a posteridade, para ajudar os futuros Googlers, gostaria de expandir a resposta do EMP.

A resposta do EMP fornece a hora no UTC (se é isso que você está procurando, use isso).

Para chegar ao horário local do cliente em C #:

Em JavaScript:

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

Em c #:

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

Crédito para este blog e resposta do EMP, mas levou alguns tentativa e erro em ambas as extremidades para acertar, então apenas fyi para o futuro pessoal.

Para ser honesto, eu não tentaria analisar essa string de data em C #, eu pessoalmente tentaria criar uma estrutura de data mais útil a partir do seu object de data javascript.

Por exemplo, você poderia usar parse() em javascript que retornará a ms representando o object de data, que você pode usar DateTime.Parse() para converter em um object C # DateTime.