【问题标题】:AngularJS date filter is adding unexpected timezone offset?AngularJS 日期过滤器添加了意外的时区偏移量?
【发布时间】:2019-12-04 10:31:35
【问题描述】:

文档:https://docs.angularjs.org/api/ng/filter/date

Plunker:https://plnkr.co/edit/q6KPNejv52SzewDlvGyu?p=preview

下面的代码sn-p:

var app = angular.module("app", []);

app.controller("ctrl", function($scope, $interval) {
    $scope.message = "It works!";
    $scope.dateStart = new Date();
    
    $interval(function() {
      $scope.dateNow = new Date();
    }, 42)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.9/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl">
    {{ message }} <br>
    
    {{ dateNow - dateStart | date: 'hh:mm:ss:sss' }} <br>
    
    {{ dateNow - dateStart | date: 'hh:mm:ss:sss' : 'UTC' }} <br>
    
</div>
  • 无时区 - 将 01 显示为小时。
  • UTC 传递为时区 - 将12 显示为小时。

在我的另一个项目中,我想出了这个解决方法......感觉很垃圾,我不想复制粘贴垃圾代码。肯定有更好的方法吗?

(也许我应该只使用时刻,包大小在这里并不重要)

app.filter('mydate', function(){
  return function(text, extra) {
    // https://stackoverflow.com/a/39209842/775359
    var date = new Date(text)
    var userTimezoneOffset = date.getTimezoneOffset() * 60000;
    var newdate = new Date(date.getTime() + userTimezoneOffset);

    return pad(newdate.getHours(),2) + ":" + pad(newdate.getMinutes(),2) + ":" + pad(newdate.getSeconds(),2) 
           + (extra ? ":" + pad(newdate.getMilliseconds(), 3) : "");
  };
});

app.filter('pad', [function(){
  return function(text, width) { 
    return pad(text, width)
  };
}]);

function pad(text, width) { 
  text = text + ''; // converting to string because if we pass number it will fail
  return text.length >= width ? text : new Array(width - text.length + 1).join('0') + text;
};

不是解决方案:AngularJS global Date timezone offset(将 GMT 设置为默认值仍显示为 12 小时)

可能重复:AngularJs filter date adding 2 hours(未回答)

【问题讨论】:

  • 猜猜这里的问题是 (date1 - date2) 不再是日期。所以你不能使用日期过滤器。
  • 就像你说的,使用moment.js你的生活会轻松很多:-)
  • 我已经喜欢 moment.js:$scope.dateInMinutes = moment.duration( moment($scope.dateNow).diff($scope.dateStart) ).asMinutes(); - 如此简单,如此富有表现力......

标签: javascript angularjs datetime timezone timezone-offset


【解决方案1】:

使用date: 'HH:mm:ss:sss' : 'UTC'使用国会大厦HH:

var app = angular.module("app", []);

app.controller("ctrl", function($scope, $interval) {
    $scope.message = "It works!";
    $scope.dateStart = new Date().valueOf();
    
    $interval(function() {
      $scope.dateNow = new Date().valueOf();
    }, 42)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.9/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl">
    {{ message }} <br>
    
    {{ dateNow - dateStart | date: 'HH:mm:ss:sss' : 'UTC' }} <br>
    
</div>

格式字符串可以由以下元素组成:

  • 'HH':一天中的小时,填充 (00-23)
  • 'H':一天中的小时 (0-23)
  • 'hh':上午/下午的小时,填充 (01-12)
  • 'h':上午/下午的小时,(1-12)

有关详细信息,请参阅

【讨论】:

  • 谢谢Cpt。明显的!我的天啊……我能把我的时间倒过来吗……这就是开发的本质,一个可以吸收大量资源的愚蠢问题。
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2018-03-15
  • 2015-02-14
  • 2019-03-09
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多