剑道UI调度程序错误地转换时间,向后添加和减去小时数



>我正在使用剑道调度程序,时区偏移量似乎在与应该发生的情况相反的方向上增加小时数并减去小时数。

当我将客户端时区更改为更西部的时区时,小时数将

添加到事件日期时间中,当我将客户端浏览器更改为更东部的时区时,将减去小时数。

因此,太平洋时区的客户端应将开始时间视为上午 10:00,但显示为下午 4:00。设置为大西洋时区的客户端将开始时间视为中午 12:00。

调度程序代码:

$("#scheduler").kendoScheduler({
    date: new Date(),
    height: 900,
    editable: false,
    views: [
        {
            type: "month",
            selected: true,
            eventHeight: 50,
            eventTemplate: $("#event-template-month").html(),
        },{
            type: "agenda",
            eventHeight: 50,
            eventTemplate: $("#event-template-sched").html(),
        }
    ],
    timezone: "America/New_York",
    dataSource: webinarSchedule,
});

事件信息保存在本地 js 文件的数组中,如下所示:

var webinarSchedule = [//Date are in utc -5:00
{
    title: "Part 1 <br/>The Golden Rule",
    shortName: "1) The Golden Rule ",
    presenter: "Bill Preston",
    description: "A great event",
    synopsis: "Learn stuff",
    seriesNote: "The first of a 4-part series.",
    registration: "https://attendee.gotowebinar.com/register/3782113333237861889",
    start: new Date("2015/1/24 1:00 PM"),
    end: new Date("2015/1/24 1:20 PM"),
},

是的,这似乎不起作用。

我发现在处理JS日期(或一般计算中的日期)时保持理智的唯一方法是使用以ISO格式序列化的UTC日期(通常,将UTC日期存储在服务器上也是一个更好的主意)。因此,我建议使用源时区的适当 ISO 字符串创建事件:

{
    title: "Part 1 <br/>The Golden Rule",
    shortName: "1) The Golden Rule ",
    presenter: "Bill Preston",
    description: "A great event",
    synopsis: "Learn stuff",
    seriesNote: "The first of a 4-part series.",
    registration: "https://attendee.gotowebinar.com/register/3782113333237861889",
    start: new Date(Date.parse("2015-02-11T13:00:00-05:00")), 
    end: new Date(Date.parse("2015-02-11T13:20:00-05:00")),
}

然后根本不设置调度程序时区选项(因此它使用本地)。如果需要传递到服务器,您可能还希望首先使用 toISOString 处理日期。

调度程序希望只接收和发送 UTC 日期 - 这就是为什么你应该使用 UTC 时区以正确的格式加载它的数据(否则当从字符串创建日期时,将使用本地用户时区,这是 JavaScript 特定的行为):

start: new Date("2015-01-24T13:00:00.000Z"),
end: new Date("2015-01-24T13:20:00.000Z"),

此外,您可以将调度程序时区设置为"Etc/UTC" - 这样,上述日期将按原样显示,而无需在客户端进行转换:

$("#scheduler").kendoScheduler({
   date: new Date("2015/1/24"),
   timezone: "Etc/UTC",

下面是一个基于上面的代码片段的 JSFiddle,显示了以下内容:http://jsfiddle.net/loanburger/0s3Lcq17/

我通过使用moment解决了这个问题.js

Javascript:

new Date(moment.utc("INSERT DATE HERE").format())

这样我就可以消除时区问题。 我不会更改 MVC 控制器上的日期。

节目有点晚了,但我目前正在评估 Telerik 的 MVC 组件,并且在使用调度程序时遇到了类似的问题。 我处理它的方式是使时区成为必需的,然后服务器端我做了以下操作:

public SchedulerViewModel HandleTimezonesToUTC(SchedulerViewModel e)
{
    TimeZoneInfoHelper tziHelper = new TimeZoneInfoHelper();
    if (!string.IsNullOrEmpty(e.StartTimezone) && string.IsNullOrEmpty(e.EndTimezone))
    {
        TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(tziHelper.FindMSEquilivalent(e.StartTimezone));
        e.Start = DateTime.SpecifyKind(e.Start, DateTimeKind.Unspecified);
        e.End = DateTime.SpecifyKind(e.End, DateTimeKind.Unspecified);
        e.Start = TimeZoneInfo.ConvertTimeToUtc(e.Start, tzi);
        e.End = TimeZoneInfo.ConvertTimeToUtc(e.End, tzi);
    }
    if (!string.IsNullOrEmpty(e.StartTimezone) && !string.IsNullOrEmpty(e.EndTimezone))
    {
        TimeZoneInfo tziStart = TimeZoneInfo.FindSystemTimeZoneById(tziHelper.FindMSEquilivalent(e.StartTimezone));
        TimeZoneInfo tziEnd = TimeZoneInfo.FindSystemTimeZoneById(tziHelper.FindMSEquilivalent(e.EndTimezone));
        e.Start = TimeZoneInfo.ConvertTimeToUtc(e.Start, tziStart);
        e.End = TimeZoneInfo.ConvertTimeToUtc(e.End, tziEnd);
    }
    return e;
}
public SchedulerViewModel HandleTimezonesFromUTC(SchedulerViewModel e)
{
    TimeZoneInfoHelper tziHelper = new TimeZoneInfoHelper();
    if (!string.IsNullOrEmpty(e.StartTimezone) && string.IsNullOrEmpty(e.EndTimezone))
    {
        TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(tziHelper.FindMSEquilivalent(e.StartTimezone));
        e.Start = DateTime.SpecifyKind(e.Start, DateTimeKind.Utc);
        e.End = DateTime.SpecifyKind(e.End, DateTimeKind.Utc);
        e.Start = TimeZoneInfo.ConvertTimeFromUtc(e.Start, tzi);
        e.End = TimeZoneInfo.ConvertTimeFromUtc(e.End, tzi);
    }
    if (!string.IsNullOrEmpty(e.StartTimezone) && !string.IsNullOrEmpty(e.EndTimezone))
    {
        TimeZoneInfo tziStart = TimeZoneInfo.FindSystemTimeZoneById(tziHelper.FindMSEquilivalent(e.StartTimezone));
        TimeZoneInfo tziEnd = TimeZoneInfo.FindSystemTimeZoneById(tziHelper.FindMSEquilivalent(e.EndTimezone));
        e.Start = TimeZoneInfo.ConvertTimeFromUtc(e.Start, tziStart);
        e.End = TimeZoneInfo.ConvertTimeFromUtc(e.End, tziEnd);
    }
    return e;
}

通过这样做,您可以删除任何意外的本地>UTC转换,并且正如其他海报之一所说,让浏览器为您调整回本地时间。

理论上,您不需要fromUTC,但是当我测试日历时,日历没有将其转换为本地时区。你也许可以侥幸分配一个"种类",但我没有测试。

不确定你在做什么,但希望它能帮助你解决一些摇摆不定的时馋问题。

相关内容

  • 没有找到相关文章

最新更新