Kendo ui 剑道网格日期时间列显示不正确的日期

Kendo ui 剑道网格日期时间列显示不正确的日期,kendo-ui,timezone,kendo-grid,kendo-asp.net-mvc,kendo-mobile,Kendo Ui,Timezone,Kendo Grid,Kendo Asp.net Mvc,Kendo Mobile,我有一个剑道网格,它有一个datetime列,当从数据库中获取日期时,我们得到了正确的日期,但在显示日期时,日期发生了变化。例如: DB日期为2017年6月7日,但考虑到年月日,在网站上显示的日期改为2017年6月6日。谁能帮我一下吗。我们的数据库和网站都位于纽约地区。Kendo UI数据源使用JavaScript日期对象表示日期。这些对象始终位于客户端的时区中,这可能会导致日期的更改。一种可能的选择是使用UTC日期: 编辑,只需将链接内容复制到此处,因为SO不喜欢链接作为唯一的答案 使用带

我有一个剑道网格,它有一个datetime列,当从数据库中获取日期时,我们得到了正确的日期,但在显示日期时,日期发生了变化。例如:
DB日期为2017年6月7日,但考虑到年月日,在网站上显示的日期改为2017年6月6日。谁能帮我一下吗。我们的数据库和网站都位于纽约地区。

Kendo UI数据源使用JavaScript日期对象表示日期。这些对象始终位于客户端的时区中,这可能会导致日期的更改。一种可能的选择是使用UTC日期:


编辑,只需将链接内容复制到此处,因为SO不喜欢链接作为唯一的答案

使用带有setter和getter的ViewModel,将
DateTime
Kind显式设置为UTC

private DateTime birthDate;
public DateTime BirthDate
{
    get { return this.birthDate; }
    set {
        this.birthDate = new DateTime(value.Ticks, DateTimeKind.Utc);
    }
}
使用
DataSource
requestEnd
事件截取传入日期字段,并将其替换为时差

@(Html.Kendo().Grid<KendoUIMVC5.Models.Person>().Name("persons")
    .DataSource(dataSource => dataSource
        .Ajax()
        .Events(ev=>ev.RequestEnd("onRequestEnd"))
    )
    // ...
)

<script>
    var onRequestEnd = function(e) {
        if (e.response.Data && e.response.Data.length) {
            var data = e.response.Data;
            if (this.group().length && e.type == "read") {
                handleGroups(data);
            } else {
                loopRecords(data);
            }
        }
    }

    function handleGroups(groups) {
        for (var i = 0; i < groups.length; i++) {
            var gr = groups[i];
            offsetDateFields(gr); //handle the Key variable as well
            if (gr.HasSubgroups) {
                handleGroups(gr.Items)
            } else {
                loopRecords(gr.Items);
            }
        }
    }

    function loopRecords(persons) {
        for (var i = 0; i < persons.length; i++) {
            var person = persons[i];
            offsetDateFields(person);
        }
    }

    function offsetDateFields(obj) {
        for (var name in obj) {
            var prop = obj[name];
            if (typeof (prop) === "string" && prop.indexOf("/Date(") == 0) {
                obj[name] = prop.replace(/\d+/, function (n) {
                    var offsetMiliseconds = new Date(parseInt(n)).getTimezoneOffset() * 60000;
                    return parseInt(n) + offsetMiliseconds
                });
            }
        }
    }
</script>
@(Html.Kendo().Grid().Name(“人”)
.DataSource(DataSource=>DataSource
.Ajax()
.Events(ev=>ev.RequestEnd(“onRequestEnd”))
)
// ...
)
var onRequestEnd=函数(e){
if(e.response.Data&&e.response.Data.length){
var数据=e.response.data;
if(this.group().length&&e.type==“read”){
HandleGroup(数据);
}否则{
循环记录(数据);
}
}
}
函数句柄组(组){
对于(变量i=0;i
您是说月和日颠倒了,还是将2017年7月6日改为2017年6月6日?否,在网站上显示日期时将其减少一。如果日期是4月6日,那么在网站上显示日期时是4月5日,时间是什么?显示的时间是否与从服务器收到的时间完全相同?如果您没有显示时间,请按我们的方式显示因为它可以帮助您了解差异的原因。我们只需要显示日期。为此,我们使用Kendo.ToString(dateVar,/“'mm/dd/yyyy'/)谢谢你的回复,我会执行它并让你知道它是否在工作。你提供的解决方案很好。再次感谢你。好的,我很高兴。请考虑将回复标记为答案。抱歉,我们得到一个问题。不是函数。这是指网格没有任何datetime列可显示。此问题似乎与原始讨论无关。网格和数据源没有groups()方法。您想做什么?最好单独发布一个问题。