AngularJS 日期过滤器正在添加意外的时区偏移?
AngularJS date filter is adding unexpected timezone offset?
文档:https://docs.angularjs.org/api/ng/filter/date
笨蛋:https://plnkr.co/edit/q6KPNejv52SzewDlvGyu?p=preview
下面的代码片段:
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
显示为小时。
在我的其他项目中,我想到了这个解决方法...感觉很垃圾,我不想复制粘贴垃圾代码。肯定有更好的方法吗?
(也许我应该使用 moment,包的大小在这里并不重要)
app.filter('mydate', function(){
return function(text, extra) {
//
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(未回答)
使用 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':AM/PM 中的小时,填充 (01-12)
- 'h':小时 AM/PM,(1-12)
有关详细信息,请参阅
文档:https://docs.angularjs.org/api/ng/filter/date
笨蛋:https://plnkr.co/edit/q6KPNejv52SzewDlvGyu?p=preview
下面的代码片段:
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
显示为小时。
在我的其他项目中,我想到了这个解决方法...感觉很垃圾,我不想复制粘贴垃圾代码。肯定有更好的方法吗?
(也许我应该使用 moment,包的大小在这里并不重要)
app.filter('mydate', function(){
return function(text, extra) {
//
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(未回答)
使用 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':AM/PM 中的小时,填充 (01-12)
- 'h':小时 AM/PM,(1-12)
有关详细信息,请参阅