点击事件中的全日历错误时间

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");