簡體   English   中英

單擊事件中的全日歷錯誤時間

[英]Fullcalendar wrong time in on click event

我正在使用角度和全日歷。 我有(驚奇的)時區問題,但似乎無法正確解決。

如果在周視圖中單擊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屬性,因為這可能會產生意想不到的副作用。 考慮下划線是指“內部”。 另外,由於矩對象具有格式化功能,因此您在這里不需要Angular的日期過濾器。 相反,只需執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM