2016-08-04 126 views
4

我想将所选日期保持为UTC格式。弹出日历显示当地日期,但所选日期为UTC

但弹出的日历与选定的日期时间不同步。

让当我点击8月13日说,与选定的日期为08/12/2011

因为在我的时区是8月13日,但它仍然是在08/12与UTC时区

inline inline

HTML
<div class="col-sm-10" ng-click="open($event)"> 
    <input type="text" class="form-control ng-pristine ng-untouched ng-valid ng-isolate-scope ng-valid-date ng-valid-required" datepicker-popup="yyyy/MM/dd" is-open="opened" datepicker-options="dateOptions" ng-required="true" close-text="Close" required="required" aria-required="false" aria-invalid="false" ng-model="form.start_date" /> 
    </div> 

JS控制器

app.controller('FlightSkuStartDatepickerCtrl', ['$scope', 
     function($scope) { 
      // Disable weekend selection 
      $scope.disabled = function(date, mode) { 
       return (mode === 'day' && (date.getDay() === 0 || date.getDay() === 6)); 
      }; 

      $scope.toggleMin = function() { 
       $scope.minDate = $scope.minDate ? null : new Date(); 
      }; 
      $scope.toggleMin(); 

      $scope.open = function($event) { 
       $event.preventDefault(); 
       $event.stopPropagation(); 

       $scope.opened = true; 
      }; 

      $scope.dateOptions = { 
       formatYear: 'yy', 
       startingDay: 1, 
       class: 'datepicker' 
      }; 
      $scope.formats = ['YYYY/MM/DD']; 
      $scope.format = $scope.formats[0]; 
     } 
    ]);  
+0

您正在试图存储您选择的时间为UTC? –

+0

首先,您应该确定timepicker的时区,然后您可以使用时刻或其他东西将其存储为UTC。但要回答您的问题,您应该提供有关您的问题的明确信息。 –

+0

@FatihAktepe是的,无论用户点击什么,我都会节省UTC时间。我知道这是不正常的。但这只是我的用例。谢谢。 – user3675188

回答

4

如果您将其存储为UTC,那么您为什么将UTC保存为问题?如果你想把你的时间从UTC改变到另一个时区,你可以使用角度角度。但是你必须给出转换时间的时刻。例如:

function utctoTimeZoneFormat(date, current_tz) { 

      var offset = moment(date).tz(current_tz).utcOffset(); 
      var returnObj = { 
       "day": "", 
       "time": "" 
      } 
      returnObj.day = moment.utc(date).tz(current_tz).utcOffset(offset).format('dddd'); 
      returnObj.time = moment.utc(date).tz(current_tz).utcOffset(offset).format('HH:mm:ss') 

      return returnObj; 
     } 

您可以通过日期参数从UI和current_tz为你的时区选定日期。但是你必须像“时代的标题”那样通过它,如“America/Los_Angeles”。

function timeZoneToUTCFormat(date, current_tz) { 

      var offset = moment(date).tz(current_tz).utcOffset(); 
      offset = offset * -1; 
      var returnObj = { 
       "day": "", 
       "time": "" 
      } 
      returnObj.day = moment.utc(date).tz(current_tz).utcOffset(offset).format('dddd'); 
      returnObj.time = moment.utc(date).tz(current_tz).utcOffset(offset).format('HH:mm:ss') 

      return returnObj; 
     } 

第二个函数使您可以将选定的日期存储为UTC。你应该相应地传递参数。例如;如果你在“America/Los_Angeles”中,你应该将你的时区作为给定的字符串传递,并将其转换为UTC。所以你可以通过使用上面写的两个函数来同步你的UI和后端。

+0

弹出日历显示用户的时区不是utc。例如,如果我在OS上将我的时区从-8更改为+8,则弹出时区将完全不同。比方说,如果我的区域在+8,当我点击2016-08-10在选定日期的弹出窗口可能是2016-08-09。如果弹出窗口显示用户时区,则我想将其同步 – user3675188

+0

,那么您可以将选定的日期存储为UTC。要更新我的答案。 –

+0

如果答案解决了您的问题,请给我一个反馈。 –

0

在UI的日期选择器的新版本有解决这个

ng-modal-options='{"timezone":"utc"}' 

这个从日期

删除时区组件在旧版本

的解决方案是一个简单的方法删除日期部分的时区组件(更好地具有可重用性的指令...

myapp.directive("dateToIso", function() { 
    var linkFunction = function (scope, element, attrs, ngModelCtrl) { 

     ngModelCtrl.$parsers.push(function (datepickerValue) { 
      return moment(datepickerValue).format("YYYY-MM-DD"); 
     }); 
    }; 

    return { 
     restrict: "A", 
     require: "ngModel", 
     link: linkFunction 
    }; 
}); 

您可以使用它像下面

<input ng-model='abc' date-to-iso ui-datepicker>