2017-04-26 91 views
0

我們的應用程序的用戶必須選擇他們想要工作的時區。這是因爲他們可能專門爲某些其他時區的客戶工作。是否有可能有角度使用不同於瀏覽器的時區?

然後將應用程序的日期存儲在UTC中。

當以本地日期的形式顯示utc日期時,Javascript會採用瀏覽器的時區偏移量,這不是我想要的。

對於顯示日期,我有一個過濾器。它需要因瀏覽器而應用的偏移量並將其刪除。然後應用用戶定義的偏移量。這適用於顯示值。

示例可能是:用戶位於UTC + 03:00,但他在應用程序中的設置是UTC-4:00。 在數據庫中有一個6am的UTC值。期望的顯示值是6-4 = 2am。這是通過消除由於他的瀏覽器應用的偏移量(-3),然後應用其設置的偏移來實現的。

  function standardDateFilterInterceptor(date, format, timezone) { 
      if (timezone === "agent") { 
       if (date !== null && date !== undefined) { 
        var momentDate = moment(date.toString(), ["YYYY-MM-DD HH:mm:ss"]); 
        if (momentDate.isValid()) { 
         date = momentDate.toDate(); 
         let offset = date.getTimezoneOffset(); 
         if (offset !== null && offset !== undefined) { 
          offset = offset * 60000 * (-1); 
          const dateWithOffset = new Date(date.getTime() + offset); 
          date = dateWithOffset; 
         } 
        } 
       } 
       if (agentTimeZoneOffset !== null && !angular.isUndefined(agentTimeZoneOffset)) { 
        timezone = agentTimeZoneOffset; 
       } 

      } 
      return originalFilter.apply(this, [date, format, timezone]); 
     } 

對於顯示值這工作,但我沒有找到一種方法來更新值。樣本中的調整值(2am)將在範圍內並覆蓋早上6點的原始值。我可以看到,當我將值更改爲3,然後回到2.是否有辦法處理這個問題?就像控制dom元素更改時在範圍中設置的內容一樣。

回答

0

我結束了該處理時在視圖中值被更新的情況下的指令

指令

app.directive('tzAdapterTime', function() { 
    return { 
     require: 'ngModel', 
     link: function ($scope, $element, $attrs, modelCtrl) { 
      modelCtrl.$formatters.push(function (inputValue) { 
       var offset = moment(modelCtrl.$modelValue).parseZone().utcOffset(); 

       return moment(modelCtrl.$modelValue).subtract(offset, 'minute').toDate(); 
      }); 

      modelCtrl.$parsers.push(function (inputValue) { 
       var offset = moment(inputValue).parseZone().utcOffset(); 
       return moment(inputValue).add(offset, 'minute').toDate(); 
      }); 
     } 
    }; 
}); 

查看

<input type="datetime-local" ng-model="article.publish" tz-adapter-time > 
相關問題