JGu*_*mer 2 javascript timezone fullcalendar momentjs
我已经为此苦苦挣扎了一段时间,所以请寻求一些帮助。
我有一个使用 Signal R 的实时多时区应用程序,所有日期时间都使用 UTC 存储和广播,我想在客户端操作它们,以避免在更新一个约会时对不同用户进行多次广播。
我试图让 fullcalendar 为用户显示适当时区的日期,它不是基于浏览器,而是基于用户登录时保存的本地字符串。
这可能吗?或者我是否需要存储偏移量并这样做(我希望避免这种情况)。我正在使用 eventRender 进行操作,但这给我带来了其他问题并引发了错误。
我的代码是:
$(document).ready(function() {
function renderCalendar() {
$('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
editable: true,
timezone: "Europe/Istanbul",
eventLimit: true, // allow "more" link when too many events
events: [{"id":1026,"taskTypeId":4,"title":"(New Appointment)","start":"2015-06-11T11:00:00Z","end":"2015-06-11T12:00:00Z", "timezone":"UTC","allDay":false,"url":null,"location":"","people":null,"className":"event-appointment"}],
eventRender: function(event, el) {
if (event.start.hasZone()) {
el.find('.fc-title').after(
$('<div class="tzo"/>').text(event.start.format('Z'))
);
}
}
});
}
renderCalendar();
});
Run Code Online (Sandbox Code Playgroud)
FullCalendar 的时区文档解释了命名时区预计在服务器上计算。虽然它支持使用时区标记事件,但它不会在客户端进行任何时区转换。除非此行为在未来版本中发生变化,否则它不适合您描述的场景。
然而,这并不意味着你被困住了。FullCalendar 依赖于moment.js ,并且 moment.js 有一个名为moment-timezone的插件。它专门设计用于使用 IANA 时区标识符执行客户端时区转换,例如"Europe/Istanbul您在示例中显示的“。
当您从 SignalR 广播收到事件时,您可以使用 moment-timezone 将 UTC 转换为所需时区,然后再将结果发送到 FullCalendar 事件对象。
var s = moment("2015-06-11T11:00:00Z").tz("Europe/Istanbul").format();
// result: "2015-06-11T14:00:00+03:00"
Run Code Online (Sandbox Code Playgroud)
补充几点:
随着世界各国政府改变其偏移量和夏令时规则的想法,时区数据会定期发生变化。订阅IANA 时区公告邮件列表,了解最新动态。预计任何时区库都会在 IANA 发布后一周左右的时间内提供更新。
由于您使用的是 SignalR,我假设您的后端必须是 .NET。FullCalendar 文档显示使用 PHP 作为后端,它已经支持 IANA 时区。但是,在 .NET 中,您可以使用Noda Time来实现相同的功能。
| 归档时间: |
|
| 查看次数: |
7309 次 |
| 最近记录: |