全日历Timezone Moment js问题
Full calendar Timezone Moment js Issue
我已经为此苦苦挣扎了一段时间,所以请伸出援手。
我有一个使用 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();
});
FullCalendar's time zone documentation 说明指定的时区应该在服务器上计算。虽然它支持使用时区标记事件,但它不会在客户端进行任何时区转换。除非此行为在未来的版本中发生变化,否则它不符合您描述的场景。
但是,这并不意味着您被卡住了。 FullCalendar 依赖于 moment.js, and there is an add-on for moment.js called moment-timezone。它专门设计用于使用 IANA 时区标识符执行客户端时区转换,例如您在示例中显示的 "Europe/Istanbul
"。
当您从 SignalR 广播接收到您的事件时,您可以在将结果发送到 FullCalendar 事件对象之前使用 moment-timezone 将 UTC 转换为所需的时区。
var s = moment("2015-06-11T11:00:00Z").tz("Europe/Istanbul").format();
// result: "2015-06-11T14:00:00+03:00"
补充几点:
时区数据会定期更改,因为世界各国政府会改变他们对时差和夏令时规则的看法。订阅 IANA Time Zone Announcements mailing list 以掌握最新动态。在 IANA 发布后一周左右的时间内,任何时区库的更新都是合理的。
由于您使用的是 SignalR,我假设您的后端必须是 .NET。 FullCalendar 文档显示使用 PHP 作为后端,它已经支持 IANA 时区。但是,在 .NET 中,您可以使用 Noda Time 实现相同的功能。
我已经为此苦苦挣扎了一段时间,所以请伸出援手。
我有一个使用 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();
});
FullCalendar's time zone documentation 说明指定的时区应该在服务器上计算。虽然它支持使用时区标记事件,但它不会在客户端进行任何时区转换。除非此行为在未来的版本中发生变化,否则它不符合您描述的场景。
但是,这并不意味着您被卡住了。 FullCalendar 依赖于 moment.js, and there is an add-on for moment.js called moment-timezone。它专门设计用于使用 IANA 时区标识符执行客户端时区转换,例如您在示例中显示的 "Europe/Istanbul
"。
当您从 SignalR 广播接收到您的事件时,您可以在将结果发送到 FullCalendar 事件对象之前使用 moment-timezone 将 UTC 转换为所需的时区。
var s = moment("2015-06-11T11:00:00Z").tz("Europe/Istanbul").format();
// result: "2015-06-11T14:00:00+03:00"
补充几点:
时区数据会定期更改,因为世界各国政府会改变他们对时差和夏令时规则的看法。订阅 IANA Time Zone Announcements mailing list 以掌握最新动态。在 IANA 发布后一周左右的时间内,任何时区库的更新都是合理的。
由于您使用的是 SignalR,我假设您的后端必须是 .NET。 FullCalendar 文档显示使用 PHP 作为后端,它已经支持 IANA 时区。但是,在 .NET 中,您可以使用 Noda Time 实现相同的功能。