Kendo ui 使用正确日期筛选KendoUI计划程序服务器 问题

Kendo ui 使用正确日期筛选KendoUI计划程序服务器 问题,kendo-ui,kendo-scheduler,Kendo Ui,Kendo Scheduler,我正在尝试使用KendoUI调度器小部件MVC helpers在一台设置为我自己的时区的计算机上过滤特定时区的约会,比如“欧洲/明斯克”,位于塔斯马尼亚州。调度程序小部件的时区设置为“Europe/Minsk”。我已经根据Telerik的代码库示例启用了服务器过滤。但是,周视图的服务器调用向服务器提供了错误的日期和时间,提供了一个UTC日期字符串,相当于我自己时区中的周一午夜,而不是配置的时区 很容易看出原因;my getAdditionalData函数中的scheduler.view.star

我正在尝试使用KendoUI调度器小部件MVC helpers在一台设置为我自己的时区的计算机上过滤特定时区的约会,比如“欧洲/明斯克”,位于塔斯马尼亚州。调度程序小部件的时区设置为“Europe/Minsk”。我已经根据Telerik的代码库示例启用了服务器过滤。但是,周视图的服务器调用向服务器提供了错误的日期和时间,提供了一个UTC日期字符串,相当于我自己时区中的周一午夜,而不是配置的时区

很容易看出原因;my getAdditionalData函数中的scheduler.view.startDate似乎返回类似以下内容:Date{Mon Oct 19 2015 00:00:00 GMT+1100 Tasmania Standard Time},它被转换为2015-10-18T13:00:00.000Z,而不是相对于配置时区的本地等效值。简而言之,调用scheduler.view.startDate返回的日期与配置的时区不符

问题 我怎样才能避开这个明显的问题?我看不到任何其他方法可以知道调度程序正在显示的日期范围,而且似乎检索它的唯一方法已被破坏

对于未更改的代码库示例,该问题是可以重现的。试着把约会拖到一周的最后几个小时,然后看着它在刷新后完全消失

为了快速参考,getAdditionalData函数如下所示:

function getAdditionalData() {
    var scheduler = $("#scheduler").getKendoScheduler();

    var result = {
        start: scheduler.view().startDate().toISOString(),
        end: scheduler.view().endDate().toISOString()
    }

    return result;
}

首先,我建议查看新的非常有用的时区帮助文章,该文章解释了时区、JavaScript日期对象、调度器如何使用它们以及远程服务应如何处理日期:

最终编辑:这里是最后一次澄清后的解决方案以及相关支持线程:

在我们方面进行了一些额外的测试并阅读了您的最后回复后,我终于了解到您所遇到的问题的确切内容。由于MVC DefaultModelBinder行为和客户端代码的一些更改,解决方案包括之前建议的服务器端日期处理。请检查以下内容-在我们和StackOverflow进行一些额外测试后,它将应用于GitHub中先前链接的演示:

用于获取正确范围的开始/结束日期(包括视图的开始时间/结束时间)的客户端代码:

用于在服务器端将日期转换为UTC的类:

服务器端的控制器:


Vladimir的回答提供了一种将日期范围转换为UTC的方法,但是调度程序上显示的日期范围不是UTC,而是配置的时区

通过使用Fabelous moment.js,我能够将其转换为正确的日期范围:

function getFilters() {
    var scheduler = $("#scheduler").getKendoScheduler();
    var start = moment.tz(getDateParts(scheduler.view().startDate()), scheduler.options.timezone);

    // Assuming the scheduler will never show part days, the end date needs an extra day to ensure events on the day are included.
    var actualEnd = new Date(scheduler.view().endDate());
    actualEnd.setDate(actualEnd.getDate() + 1);

    var end = moment.tz(getDateParts(actualEnd), scheduler.options.timezone);

    var result = {
        start: start.toISOString(),
        end: end.toISOString()
    }

    return result;
}

function getDateParts(date) {
    return [
        date.getFullYear(),
        date.getMonth(),
        date.getDate(),
        date.getHours(),
        date.getMinutes(),
        date.getSeconds()
    ];
}
现在,它会查询web服务中属于可见日期范围内的所有事件,而这是正确的。现在,我只需要弄清楚为什么Scheduler小部件在周视图的最后一天没有显示任何事件,尽管这些事件在web服务调用中以正确的UTC时间返回


编辑:最后一天的事件没有呈现的原因是我无意中更改了视图的结束日期。当然日期在JavaScript中不是不可变的。

传递给服务器的字符串是UTC格式的。注意,后缀是Z,并且解释正确。问题是开始的日期是错误的。从塔斯马尼亚标准时间的午夜星期一开始,而不是欧洲/明斯克的塔斯马尼亚等效的午夜星期一,我认为,应该是日期{2015年10月18日星期一16:00:00 GMT+1100塔斯马尼亚标准时间}。抱歉,将该日期定为{2015年10月19日星期一08:00:00 GMT+1100塔斯马尼亚标准时间}谢谢@Vladimir Iliev,scheduler.view.startTime函数似乎解决了获取正确查询时间的问题。可能需要注意的是,month视图不存在日期。从提供的信息来看,服务器端似乎仍然没有正确处理日期。使用下面我的回复中的设置,将返回视图确切结束时间内的事件。此外,您还可以使用kendo.timezone名称空间中可用的方法将时区应用于日期,而不是使用第三方库。顺便问一下,如果我的上一个建议在您这方面也像预期的那样有效,请您将我的答复标记为答案?这样,使用谷歌搜索问题的人可以更确信答案是正确的。@Vladimir Iliev我已经试过投票给你,认为你的答案很有帮助,但是我的代表分数太低了,没有什么区别。如果有人否决了我的问题和答案,那就没用了。
public class FilterRange
{
    private DateTime start;
    public DateTime Start
    {
        get
        {
            return start;
        }
        set
        {
            start = value.ToUniversalTime();
        }
    }

    private DateTime end;
    public DateTime End
    {
        get
        {
            return end;
        }
        set
        {
            end = value.ToUniversalTime();
        }
    }
}
public virtual JsonResult Read(FilterRange range)
{
    return Json(taskService.GetRange(range.Start, range.End));
}
function getFilters() {
    var scheduler = $("#scheduler").getKendoScheduler();
    var start = moment.tz(getDateParts(scheduler.view().startDate()), scheduler.options.timezone);

    // Assuming the scheduler will never show part days, the end date needs an extra day to ensure events on the day are included.
    var actualEnd = new Date(scheduler.view().endDate());
    actualEnd.setDate(actualEnd.getDate() + 1);

    var end = moment.tz(getDateParts(actualEnd), scheduler.options.timezone);

    var result = {
        start: start.toISOString(),
        end: end.toISOString()
    }

    return result;
}

function getDateParts(date) {
    return [
        date.getFullYear(),
        date.getMonth(),
        date.getDate(),
        date.getHours(),
        date.getMinutes(),
        date.getSeconds()
    ];
}