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