如何修复 kendo 网格日期时间格式取决于当地时间

How to fix kendo grid datetime format depends on local time

我有 kendo 具有 DateTime 值的网格,我住在格林威治标准时间 +02:00 时区,但我的客户端数据库在格林威治标准时间 +06:30。

问题是,当我检查数据库时间时 10:25 但是当我检查浏览器时间时 05:55。

我使用的日期时间格式如下:

.ClientTemplate("#= kendo.toString(DateTran, 'dd.MM.yyyy HH:mm:ss') #")

如何解决这个问题并直接在数据库中显示值?有什么特殊的格式吗?

使用带有 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事件拦截传入的Date字段,并用时差替换。

@(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>