Breeze 使用DateTimeZone处理的datetime utc处理

Breeze 使用DateTimeZone处理的datetime utc处理,breeze,Breeze,我正在试图找出为什么我在客户端的日期与在服务器上的日期不同。。。下面我有一个breezeconfig类,我认为它允许我的服务器端“未指定”日期序列化为“utc”。。。然而,“2011-08-11”的日期仍然被序列化为“2011-08-11T00:00:00.000”,我认为该日期末尾缺少“Z”,以表示utc。。。有什么想法吗?多谢各位 public class BreezeConfig : Breeze.WebApi.BreezeConfig { protected overrid

我正在试图找出为什么我在客户端的日期与在服务器上的日期不同。。。下面我有一个breezeconfig类,我认为它允许我的服务器端“未指定”日期序列化为“utc”。。。然而,“2011-08-11”的日期仍然被序列化为“2011-08-11T00:00:00.000”,我认为该日期末尾缺少“Z”,以表示utc。。。有什么想法吗?多谢各位

public class BreezeConfig : Breeze.WebApi.BreezeConfig
   {
    protected override Newtonsoft.Json.JsonSerializerSettings CreateJsonSerializerSettings()
    {
        var ret = base.CreateJsonSerializerSettings();
        ret.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;            
        return ret;
    }        
}

我猜您的服务器数据类型是DateTime(不是DateTime2或DateTimeOffset),因此没有明确的时区信息

Breeze不会以任何方式操纵进出服务器的日期时间,除非向服务器返回的任何日期添加UTZ时区说明符,而这些日期尚未包含UTZ时区说明符。之所以这样做,是因为不同的浏览器对没有时区说明符的日期的解释不同,我们希望浏览器之间保持一致


这在这里发布的答案中有更详细的讨论

设置
ret.DateTimeZoneHandling=Newtonsoft.Json.DateTimeZoneHandling.Utc无法按预期工作,因为基本Breeze.WebApi.BreezeConfig.CreateJsonSerializerSettings()创建的ret会添加到ret.Converters列表中。默认情况下,如果DateTime.Kind为DateTimeKind.Unspecified,则IsoDateTimeConverter不会将“Z”添加到输出字符串中。就像杰伊·特拉班特回答的那样-
breeze.js修复了这个客户端

有了这些知识,您可以轻松地让服务器将所有日期作为UTC返回:

var isoDateTimeConverter = ret.Converters.OfType<Newtonsoft.Json.Converters.IsoDateTimeConverter>().Single();
isoDateTimeConverter.DateTimeStyles = System.Globalization.DateTimeStyles.AssumeUniversal;
var isoDateTimeConverter=ret.Converters.OfType().Single();
isoDateTimeConverter.DateTimeStyles=System.Globalization.DateTimeStyles.AssumeUniversal;
由于IsoDateTimeConverter-中存在错误,因此最好从Converters集合中完全删除IsoDateTimeConverter,并将DateTimeZoneHandling设置为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;
    }
}
公共类CustomBreezeConfig:Breeze.ContextProvider.BreezeConfig
{
受保护的覆盖Newtonsoft.Json.JsonSerializerSettings CreateJsonSerializerSettings()
{
var settings=base.CreateJsonSerializerSettings();
settings.DateTimeZoneHandling=Newtonsoft.Json.DateTimeZoneHandling.Utc;
var isoDateTimeConverter=settings.Converters.OfType().Single();
设置。转换器。移除(isoDateTimeConverter);
返回设置;
}
}