2015-03-03 9 views
5

Używam kątowego i pełnego kalendarza. Mam (niespodziankę) problemy z strefami czasowymi i nie mogę tego naprawić.Pełny kalendarz nieprawidłowego czasu zdarzenia kliknięcia

Jeśli w weekview klikam na 08:00 godziny, otwieram modalne i pokazuje czas, widzę 09.00 godzin.

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

To (ATM) A +0100 stref czasowych, a podczas lecie +0200 stref czasowych

Kliknięcie zdarzenia:

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

Aby wyświetlić czas:

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

W tym przypadku $ scope.start wyświetla kliknięty czas +1

Wygląda więc na to, że funkcja fullcalendar zabiera czas, który kliknąłem i zamienia ją na wybraną strefę czasową, ale oczekiwałbym, że zinterpretuje to kliknięcie jako czas w wybranej strefie czasowej.

Widocznie mam sobie z tym źle, więc to, co jest poprawny sposób to zrobić? ($scope.start powinien pokazać czas, który kliknąłem (najlepiej w mojej strefie czasowej)). Następnie wysyłam go na serwer, na którym jest przechowywany jako UTC.

Odpowiedz

5

Aktualna wersja FullCalendar wykorzystuje moment.js obszernie. Problemy, które opisujesz, pochodzą z niewłaściwego użycia obiektów moment. Konkretnie:

$scope.start = event.toDate(); 

Po wywołaniu toDate, wrócisz regularnego JavaScript Date obiekt - który będzie oparty na tej samej UTC chwili, ale będzie zawsze wziąć na zachowanie strefy czasowej, w której kod jest bieganie. Masz kilka opcji:

  • Możesz zachować go jako moment obiektu:

    $scope.start = event; 
    
  • można sformatować go do łańcucha ISO, który zachowuje strefę czasową offset:

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

W przypadku każdej z tych opcji należy wykonać operację , używając z $scope.start, aby spodziewać się albo moment lub ciąg, a nie Date.

Również w tym kodzie:

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

Nigdy nie powinno dostępu do właściwości _d bezpośrednio, ponieważ nie może być niezamierzone skutki uboczne. Rozważ podkreślenie jako "wewnętrzne". Poza tym nie potrzebujesz filtra daty Angular, ponieważ obiekty mają możliwość formatowania. Zamiast tego, po prostu to zrobić:

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