Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

datetime utc handling with DateTimeZoneHandling

Tags:

breeze

i am trying to figure out why my dates on the client are different than my dates on the server... down below i have a breezeconfig class that i thought would allow my server side "unspecified" dates to be serialized as "utc"... however a date of "2011-08-11" is still being serialized as "2011-08-11T00:00:00.000" which i believe is missing the "Z" at the end in order to signify utc... any ideas? thank you

public class BreezeConfig : Breeze.WebApi.BreezeConfig
   {
    protected override Newtonsoft.Json.JsonSerializerSettings CreateJsonSerializerSettings()
    {
        var ret = base.CreateJsonSerializerSettings();
        ret.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;            
        return ret;
    }        
}
like image 216
giancarloa Avatar asked Dec 31 '25 14:12

giancarloa


1 Answers

Setting ret.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc; doesn't work as expected because ret created by the base Breeze.WebApi.BreezeConfig.CreateJsonSerializerSettings() adds IsoDateTimeConverter to the ret.Converters list. By default IsoDateTimeConverter will not add 'Z' to the output string if DateTime.Kind is DateTimeKind.Unspecified. Like Jay Trabant answered - breeze.js fixes this client-side.

With this knowledge it's ease to make your server return all dates as UTC:

var isoDateTimeConverter = ret.Converters.OfType<Newtonsoft.Json.Converters.IsoDateTimeConverter>().Single();
isoDateTimeConverter.DateTimeStyles = System.Globalization.DateTimeStyles.AssumeUniversal;

Because there is a bug in IsoDateTimeConverter - Issue with DateTimeStyles, it's better to completely remove IsoDateTimeConverter from the Converters collection and set DateTimeZoneHandling to Utc:

public class CustomBreezeConfig : Breeze.ContextProvider.BreezeConfig
{
    protected override Newtonsoft.Json.JsonSerializerSettings CreateJsonSerializerSettings()
    {
        var settings = base.CreateJsonSerializerSettings();
        settings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;

        var isoDateTimeConverter = settings.Converters.OfType<Newtonsoft.Json.Converters.IsoDateTimeConverter>().Single();
        settings.Converters.Remove(isoDateTimeConverter);

        return settings;
    }
}
like image 174
pawel Avatar answered Jan 05 '26 13:01

pawel



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!