First, be sure you have set:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
Otherwise you will get the ISO8601 format instead of the Microsoft format. (ISO8601 is much better, but you said you can't change the iOS app.)
Then, you need to realize that for DateTime
values, the .Kind
has an effect on how the serialization works. If you have one with DateTimeKind.Utc
, then it will not contain an offset because that's how this particular format works.
If you want to ensure that an offset is always produced, then use the DateTimeOffset
value instead. This will provide an offset of +0000
for UTC.
For example:
var settings = new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
var dt = DateTimeOffset.UtcNow;
var json = JsonConvert.SerializeObject(dt, settings);
Debug.WriteLine(json); // "\/Date(1383153418477+0000)\/"
But you need to be very careful with this approach that all consumers honor the offset. For example, if a client receives this and parses it into a DateTime
using WCF's DataContractJsonSerializer
, there's a known bug that any offset will be treated as if it was the local time of the receiving computer, regardless of what the value of that offset actually is.
If at all possible, you should switch over both the server and the application to use ISO8601 formatting instead.