Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Asp-net web api output datetime with the letter T

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?

like image 350
kaboom Avatar asked Aug 08 '13 23:08

kaboom


1 Answers

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.

like image 72
Matt Johnson-Pint Avatar answered Nov 10 '22 05:11

Matt Johnson-Pint