点击事件中的全日历错误时间
Fullcalendar wrong time in on click event
我正在使用 angular 和全日历。我有(令人惊讶的)时区问题,我似乎无法正确处理。
如果在周视图中单击 08:00,我会打开一个模式并显示时间,我会看到 09:00。
timezone: "Europe/Brussels",
ignoreTimezone: false,
这是 (atm) +0100 时区,夏季是 +0200 时区
点击事件:
dayClick: function (date, jsEvent, view) {
$scope.newEventDate = date;
var modalInstance = $modal.open({
templateUrl: 'newRosterEvent',
controller: 'NewEventModalController',
backdrop: "true",
resolve: {
event: function () {
return $scope.newEventDate;
},
stage: function () {
return $scope.stage;
}
}
});
显示时间:
stagewebApp.controller('NewEventModalController', ["$scope", "$modalInstance","$filter", "event", "stage", function ($scope, $modalInstance, $filter,event, stage) {
$scope.stage = stage;
$scope.day = new Date($filter('date')(event._d, "yyyy-MM-dd"));
$scope.start = event.toDate();
....more code....
}
此时$scope.start显示点击时间+1
所以 fullcalendar 似乎占用了我点击的时间并将其转换为所选时区,但我希望它会将点击时间解释为我选择的时区。
显然我在解决这个问题,那么正确的方法是什么? ( $scope.start
应该显示我点击的时间(最好是在我的时区)。然后我将它发送到服务器,在那里它被存储为 UTC。
当前版本的 FullCalendar 广泛使用 moment.js。您描述的问题是由于 moment
对象使用不当造成的。具体来说:
$scope.start = event.toDate();
当您调用 toDate
时,您会返回一个常规的 JavaScript Date
对象 - 它将基于相同的 UTC 时刻,但 始终 采取代码为 运行 的时区的行为。您有几个选择:
您可以将其保存为 moment
对象:
$scope.start = event;
您可以将其格式化为保留时区偏移量的 ISO 字符串:
$scope.start = event.format(); // ex: '2015-03-04T08:00:00+01:00'
无论选择哪个选项,您都需要按照 $scope.start
的 用法 进行操作,以获得 moment
或字符串,而不是Date
.
此外,在这段代码中:
$scope.day = new Date($filter('date')(event._d, "yyyy-MM-dd"));
您永远不应直接访问 _d
属性,因为这可能会产生意想不到的副作用。考虑下划线表示 "internal"。此外,您在这里不需要 Angular 的日期过滤器,因为 moment 对象具有格式化功能。相反,只需这样做:
$scope.day = event.format("YYYY-MM-DD");
我正在使用 angular 和全日历。我有(令人惊讶的)时区问题,我似乎无法正确处理。
如果在周视图中单击 08:00,我会打开一个模式并显示时间,我会看到 09:00。
timezone: "Europe/Brussels",
ignoreTimezone: false,
这是 (atm) +0100 时区,夏季是 +0200 时区
点击事件:
dayClick: function (date, jsEvent, view) {
$scope.newEventDate = date;
var modalInstance = $modal.open({
templateUrl: 'newRosterEvent',
controller: 'NewEventModalController',
backdrop: "true",
resolve: {
event: function () {
return $scope.newEventDate;
},
stage: function () {
return $scope.stage;
}
}
});
显示时间:
stagewebApp.controller('NewEventModalController', ["$scope", "$modalInstance","$filter", "event", "stage", function ($scope, $modalInstance, $filter,event, stage) {
$scope.stage = stage;
$scope.day = new Date($filter('date')(event._d, "yyyy-MM-dd"));
$scope.start = event.toDate();
....more code....
}
此时$scope.start显示点击时间+1
所以 fullcalendar 似乎占用了我点击的时间并将其转换为所选时区,但我希望它会将点击时间解释为我选择的时区。
显然我在解决这个问题,那么正确的方法是什么? ( $scope.start
应该显示我点击的时间(最好是在我的时区)。然后我将它发送到服务器,在那里它被存储为 UTC。
当前版本的 FullCalendar 广泛使用 moment.js。您描述的问题是由于 moment
对象使用不当造成的。具体来说:
$scope.start = event.toDate();
当您调用 toDate
时,您会返回一个常规的 JavaScript Date
对象 - 它将基于相同的 UTC 时刻,但 始终 采取代码为 运行 的时区的行为。您有几个选择:
您可以将其保存为
moment
对象:$scope.start = event;
您可以将其格式化为保留时区偏移量的 ISO 字符串:
$scope.start = event.format(); // ex: '2015-03-04T08:00:00+01:00'
无论选择哪个选项,您都需要按照 $scope.start
的 用法 进行操作,以获得 moment
或字符串,而不是Date
.
此外,在这段代码中:
$scope.day = new Date($filter('date')(event._d, "yyyy-MM-dd"));
您永远不应直接访问 _d
属性,因为这可能会产生意想不到的副作用。考虑下划线表示 "internal"。此外,您在这里不需要 Angular 的日期过滤器,因为 moment 对象具有格式化功能。相反,只需这样做:
$scope.day = event.format("YYYY-MM-DD");