Fullcalendar temps erroné sur l'événement de clic

J'utilise angular and fullcalendar. J'ai des problèmes de fuseau horaire (surpris), et je ne peux pas avoir raison.

Si dans la vision de semaine je clique sur 08.00 heures, j'ouvre un mode et montre le temps, je vois 09.00 heures.

timezone: "Europe/Brussels", ignoreTimezone: false, 

Ceci est (atm) a +0100 fuseau horaire, et pendant l'été un fuseau horaire de +0200

L'événement de clic:

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

Pour afficher l'heure:

 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.... } 

Dans ce cas, $ scope.start affiche l'heure cliquée +1

Il semble donc que fullcalendar prend le temps de cliquer et de le convertir dans la fuseau horaire sélectionné, mais je m'attends à ce qu'il interprète le temps de clics comme étant dans la zone de temps que j'ai sélectionnée.

Apparemment, je m'attaque à ce problème, alors quelle est la manière correcte de le faire? ( $scope.start devrait indiquer l'heure où j'ai cliqué (de préférence dans mon fuseau horaire)). Ensuite, je l'envoie au serveur où il est stocké sous la forme UTC.

La version actuelle de FullCalendar utilise moment.js de manière exhaustive. Les problèmes que vous décrivez résulte de l'utilisation incorrecte d'objets moment . Plus précisément:

 $scope.start = event.toDate(); 

Lorsque vous appelez toDate , vous récupérez un objet Date JavaScript régulier – qui sera basé sur le même instant UTC, mais prendra toujours le comportement du fuseau horaire où le code est en cours d'exécution. Vous avez quelques options:

  • Vous pouvez le conserver comme un moment objet:

     $scope.start = event; 
  • Vous pouvez le formater à une chaîne ISO qui conserve le décalage du fuseau horaire:

     $scope.start = event.format(); // ex: '2015-03-04T08:00:00+01:00' 

Avec l'une ou l'autre option, vous devrez suivre l' utilisation de $scope.start pour attendre soit un moment soit une chaîne, plutôt qu'une Date .

En outre, dans ce code:

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

Vous ne devez jamais accéder à la propriété _d directement, car il peut y avoir des effets secondaires involontaires. Considérons le trait de soulignement comme signifiant "interne". En outre, vous n'avez pas besoin du filtre de date d'Angular ici car les objets instantanés ont des capacités de mise en forme. Au lieu de cela, procédez comme suit:

 $scope.day = event.format("YYYY-MM-DD");