Fullcalendar错误的点击事件时间

Kev*_*vin 5 javascript timezone fullcalendar angularjs

我正在使用angular和fullcalendar.我有(惊喜)时区问题,我似乎无法做到正确.

如果在周视图中我点击08.00小时,我打开一个模态并显示时间,我看到09.00小时.

timezone: "Europe/Brussels",
ignoreTimezone: false,
Run Code Online (Sandbox Code Playgroud)

这是(atm)a +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;
                   }
            }
       });
Run Code Online (Sandbox Code Playgroud)

要显示时间:

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....
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,$ scope.start显示点击的时间+1

因此,似乎fullcalendar占用我点击的时间并将其转换为所选的时区,但我希望它将点击的时间解释为我选择的时区.

显然我正在解决这个问题,那么这样做的正确方法是什么?($scope.start应显示我点击的时间(最好是在我的时区)).然后我将它发送到存储为UTC的服务器.

Mat*_*int 5

当前版本的FullCalendar广泛使用moment.js.您描述的问题来自moment对象的不当使用.特别:

$scope.start = event.toDate();
Run Code Online (Sandbox Code Playgroud)

当您调用时toDate,您将获得一个常规JavaScript Date对象 - 该对象将基于相同的UTC时刻,但始终会采用运行代码的时区的行为.你有几个选择:

无论使用哪种方法,你需要用坚持到底使用$scope.start期望无论是moment或字符串,而不是一个Date.

此外,在此代码中:

$scope.day = new Date($filter('date')(event._d, "yyyy-MM-dd"));
Run Code Online (Sandbox Code Playgroud)

您不应该_d直接访问该属性,因为可能会出现意外的副作用.将下划线视为"内部".此外,您不需要Angular的日期过滤器,因为时刻对象具有格式化功能.相反,只需这样做:

$scope.day = event.format("YYYY-MM-DD");
Run Code Online (Sandbox Code Playgroud)