Asp-net web api output datetime con la letra T

los datos en el DB se ven así

2011-09-07 14:43:22.520 

Pero mi API web genera los datos y reemplaza el espacio con la letra T

 2011-09-07T14:43:22.520 

Puedo replace la letra T con un espacio nuevamente en jquery, pero ¿puedo solucionar este problema desde la API web (hacer que la API web emita los datos originales?)

Tampoco quiero los milisegundos al final. ¿Cómo puedo deshacerme de ellos?

El formatting de cómo ve la date en la database suele ser irrelevante, ya que se debe pasar a .Net como DateTime , no como una string . (Si lo está almacenando como varchar en la database, tiene un problema mayor).

ASP.Net WebAPI está devolviendo el valor en formatting definido por ISO8601 y RFC3339 . Esto es algo bueno, ya que es un formatting legible por máquina reconocido. Probablemente no quieras cambiarlo.

Si realmente desea cambiarlo, deberá implementar un JSONConverter JsonConverter personalizado, derivado de DateTimeConverterBase . Esto se discute aquí y aquí .

Pero en su lugar, debe considerar cómo está usando el resultado real en su aplicación cliente. Usted mencionó a jQuery, así que supongo que su consumidor es JavaScript. En muchos browseres, el valor ISO8601 que tiene ya es reconocido por el constructor Date JavaScript, por lo que puede hacer esto:

 var dt = new Date("2011-09-07T14:43:22.520"); 

Pero esto no funcionará en todos los browseres . Y Date no tiene mucha flexibilidad cuando se trata de formatear. Por lo tanto, es posible que desee considerar una biblioteca como moment.js . Con eso en su lugar, puedes hacer esto:

 var m = moment("2011-09-07T14:43:22.520"); var s = m.format("YYYY-MM-DD HH:mm:ss"); // output: "2011-09-07 14:43:22" 

Tenga en count que la cadena de formatting aquí se ajusta a moment.js, no a .NET. Hay diferencias en la sensibilidad de mayúsculas y minúsculas. Consulte la documentation de momento.js para más detalles.

Otra cosa: dado que el valor que proporcionó no tiene una Z al final, ni una compensación como -07:00 , entonces supongo que proviene de un DateTime cuyo valor .Kind es DateTimeKind.Unspecified . Debe tener en count que cuando esto se envía a JavaScript (o en cualquier otro lugar), no hay información sobre qué zona horaria se representa. JavaScript asumirá la zona horaria local del browser .

Si eso no es lo que pretendías, entonces necesitas almacenar los valores UTC en tu database y asegurarte de que tengan DateTimeKind.Utc para que se serialicen con una Z al final. JavaScript lo normalizará en la zona horaria del browser, pero igual hablará del mismo momento.

Alternativamente, podría usar un tipo DateTimeOffset , que se serializaría con el desplazamiento específico. JavaScript aún normalizará esto en la zona horaria del usuario.