2009-12-09 12 views
31

Tengo el objeto de fecha de javascript que me da una cadena de fecha en este formato, "Wed Dec 16 00:00:00 UTC-0400 2009".Fecha de Javascript a C# a través de Ajax

paso esta a través de Ajax al servidor (ASP.NET C#)

¿Cómo puedo convertir, "Mar Dic 16 de 0400 00:00:00 GMT-2009" a un objeto DateTime C#. DateTime.Parse falla.

Respuesta

52

Puede utilizar DateTime.ParseExact que le permite especificar una cadena de formato que se utilizará para el análisis:

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

1 No me di cuenta que podía hacer esto, muy fresco :) – Jay

+0

Es posible que desee usar DateTimeOffset en su lugar. – ColacX

0

Para ser sincero, no intentaría analizar esa cadena de fecha en C#, personalmente intentaría crear una estructura de fecha más útil a partir de su objeto de fecha de javascript.

Por ejemplo, puede usar parse() en javascript que devolverá el ms que representa el objeto de fecha, que puede usar DateTime.Parse() para convertirlo en un objeto C# DateTime.

30

La forma más fiable sería el uso de milisegundos desde el tiempo. Puede obtenerlo fácilmente en JavaScript llamando al Date.getTime(). Luego, en C# se puede convertir a un DateTime como esto:

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

Hay que multiplicar por 10.000 convertir de milisegundos a "ticks", que son 100 nanosegundos.

+1

Sé que esta es una respuesta vieja, pero tengo una pregunta.¿Hay alguna razón en particular para agregar un nuevo TimeSpan en lugar de llamar al método '.AddMilliseconds' de DateTime? – Joshua

+1

No hay razón que pueda recordar. He editado la respuesta para usar 'AddTicks' ahora, que es probablemente un poco más rápido que' AddMilliseconds' (aquí estamos hablando de algunos ciclos de CPU). – EMP

+1

Me llamó la atención acerca de por qué la "época" es el 01/01/19001. Resulta que esta es la "época de Unix". Pensé que compartiría en caso de que los demás tuvieran curiosidad o confusión: http://en.wikipedia.org/wiki/Unix_time –

5

Solo para la posteridad, para ayudar a futuros colegas de Google, me gustaría ampliar la respuesta de EMP.

La respuesta de EMP proporciona la hora en UTC (si eso es lo que está buscando, utilícelo).

Para llegar a la cliente, hora local en C#:

En JavaScript:

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

En C#:

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

crédito a this blog y la respuesta del EMP, pero tomó un poco prueba y error en ambos extremos para hacerlo bien, así que solo fyi para la gente del futuro.

+0

Esta es la respuesta más correcta que maneja correctamente el ajuste de zona horaria. –

22

Esto puede no ser posible en su caso, pero realmente recomiendo actualizar el código JS para pasar fechas/horas en formato ISO 8601. http://en.wikipedia.org/wiki/ISO_8601

ISO 8601 no es solo la norma formal, sino que también es fácil de usar y evita muchas molestias en la zona horaria.

8601 Para obtener cadenas de fecha y hora en Javascript:

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

8601 Para leer cadenas de fecha y hora en C#:

DateTime d = DateTime.Parse(json_string); 
+0

Veo que este es el mejor enfoque porque es un solo paso y no requiere pasar por ningún otro círculo para manejar la zona horaria o el análisis System.DateTime. – zomf

+0

Estoy usando este enfoque para cumplir con momentjs –

+0

Esta respuesta funciona perfectamente para mi escenario. – blfuentes

Cuestiones relacionadas