Asp-net web api output datetime with the letter T
.net, asp.net-web-api, datetime, javascript, json.net
Solution
The format of how you see the date in the database is usually irrelevant, because it should be passed into .Net as a `DateTime` - not as a `string`. (If you are storing it as a `varchar` in the database, you have a bigger problem.)
ASP.Net WebAPI is returning the value in format defined by ISO8601 and RFC3339. This is a good thing, as it is a recognized machine-readable format. You probably don't want to change it.
If you really want to change it, you would need to implement a custom JSON.Net `JsonConverter`, deriving from `DateTimeConverterBase`. This is discussed here and here.
But instead, you should consider how you are using the actual result in your client application. You mentioned jQuery, so I will assume your consumer is JavaScript. In many browsers, the ISO8601 value that you have is already recognized by the JavaScript `Date` constructor, so you might be able to just do this:
var dt = new Date("2011-09-07T14:43:22.520");
But this won't work in all browsers. And `Date` doesn't have a whole lot of flexibility when it comes to formatting. So instead, you might want to consider a library such as moment.js. With that in place, you can do this:
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"
Please note that the format string here conforms to moment.js, not to .NET. There are differences in case sensitivity. Please refer to the moment.js documentation for details.
One other thing - since the value you provided doesn't have either a `Z` at the end, nor does it have an offset such as `-07:00`, then I assume it came from a `DateTime` whos `.Kind` value is `DateTimeKind.Unspecified`. You should be aware that when this gets sent into JavaScript (or anywhere else for that matter), there is no information about what time zone is represented. JavaScript will assume the local time zone of the browser.
If that's not what you had intended, then you need to store UTC values in your database, and make sure they have `DateTimeKind.Utc` so they get serialized with a `Z` at the end. JavaScript will normalize this to the browser's time zone, but you will still be talking about the same moment in time.
Alternatively, you could use a `DateTimeOffset` type - which would serialize with the specific offset. JavaScript will still normalize this to the user's time zone.
Problem
the data in the DB look like this ``` 2011-09-07 14:43:22.520 ``` But my Web API outputs the data and replace the space with the letter T ``` 2011-09-07T14:43:22.520 ``` I can replace the letter T with a space again in jquery, but can I fix this problem from the Web API (make the web api output the original data?) I also do not want the miliseconds at the end. How can I get rid of them?