我有一个以毫秒为单位的UTC日期,我将其传递给Angular的日期过滤器进行人类格式化。
{{someDate | date:'d MMMM yyyy'}}
太棒了,除了someDate
是使用UTC时间,而日期过滤器将其视为本地时间。
我该如何告诉Angular someDate
是UTC时间?
谢谢。
我有一个以毫秒为单位的UTC日期,我将其传递给Angular的日期过滤器进行人类格式化。
{{someDate | date:'d MMMM yyyy'}}
太棒了,除了someDate
是使用UTC时间,而日期过滤器将其视为本地时间。
我该如何告诉Angular someDate
是UTC时间?
谢谢。
类似问题 在这里
我会重新发布我的回答并提出合并:
输出UTC似乎是一些混淆的主题 - 人们似乎倾向于使用moment.js。
从这个答案中借鉴,您可以做类似这样的事情(即使用将日期创建为UTC构造函数的转换函数),而不使用moment.js:
控制器
var app1 = angular.module('app1',[]);
app1.controller('ctrl',['$scope',function($scope){
var toUTCDate = function(date){
var _utc = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
return _utc;
};
var millisToUTCDate = function(millis){
return toUTCDate(new Date(millis));
};
$scope.toUTCDate = toUTCDate;
$scope.millisToUTCDate = millisToUTCDate;
}]);
模板
<html ng-app="app1">
<head>
<script data-require="angular.js@*" data-semver="1.2.12" src="http://code.angularjs.org/1.2.12/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body>
<div ng-controller="ctrl">
<div>
utc {{millisToUTCDate(1400167800) | date:'dd-M-yyyy H:mm'}}
</div>
<div>
local {{1400167800 | date:'dd-M-yyyy H:mm'}}
</div>
</div>
</body>
</html>
这里是 plunker,可以用它进行测试。
还要注意,使用这种方法时,如果使用 Angular 的日期过滤器中的 'Z',似乎仍会打印您本地的时区偏移量。
这是一个筛选器,可以接受日期字符串或javascript Date()对象。它使用Moment.js,并且可以应用任何Moment.js转换函数,例如流行的'fromNow'。
angular.module('myModule').filter('moment', function () {
return function (input, momentFn /*, param1, param2, ...param n */) {
var args = Array.prototype.slice.call(arguments, 2),
momentObj = moment(input);
return momentObj[momentFn].apply(momentObj, args);
};
});
所以...
{{ anyDateObjectOrString | moment: 'format': 'MMM DD, YYYY' }}
将显示2014年11月11日
{{ anyDateObjectOrString | moment: 'fromNow' }}
将显示10分钟前
如果需要调用多个时间函数,可以链接它们。这会转换为UTC然后进行格式化...
{{ someDate | moment: 'utc' | moment: 'format': 'MMM DD, YYYY' }}
在 angular.js 存储库中,有一个错误报告 https://github.com/angular/angular.js/issues/6546#issuecomment-36721868
ossek解决方案的进化版本
自定义过滤器更加适合,您可以在项目中任何地方使用它
js文件
var myApp = angular.module('myApp',[]);
myApp.filter('utcdate', ['$filter','$locale', function($filter, $locale){
return function (input, format) {
if (!angular.isDefined(format)) {
format = $locale['DATETIME_FORMATS']['medium'];
}
var date = new Date(input);
var d = new Date()
var _utc = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
return $filter('date')(_utc, format)
};
}]);
<p>This will convert UTC time to local time<p>
<span>{{dateTimeInUTC | utcdate :'MMM d, y h:mm:ss a'}}</span>
input
中的日期末尾包含字符串" UTC",则它仍然可以工作。 - Jörn Berkefeld$locale['DATETIME_FORMATS']['medium']
而不是固定的备用格式吗?这样你就可以使用 Angular 自己的本地化了。你的格式看起来非常像 en_US 格式,在世界其他地方都很不常见。 - Jörn Berkefeld如果你使用moment.js,你可以使用moment().utc()函数将moment对象转换为UTC时间。你也可以在控制器内使用moment().format()函数来处理一个漂亮的格式,而不是在视图中处理。例如:
moment(myDate).utc().format('MM/DD/YYYY')
moment().utc(myDate).format('MM/DD/YYYY')
- nir经过一些研究,我找到了一个很好的解决方案,可以将UTC转换为本地时间,请查看这个代码片段。希望它能够有所帮助。
https://jsfiddle.net/way2ajay19/2kramzng/20/
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app ng-controller="MyCtrl">
{{date | date:'yyyy-mm-dd hh:mm:ss' }}
</div>
<script>
function MyCtrl($scope) {
$scope.d = "2017-07-21 19:47:00";
$scope.d = $scope.d.replace(" ", 'T') + 'Z';
$scope.date = new Date($scope.d);
}
</script>
toUTCString()
。
var app = angular.module('myApp', []);
app.controller('dateCtrl', function($scope) {
$scope.today = new Date();
});
app.filter('utcDate', function() {
return function(input) {
return input.toUTCString();
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<div ng-app="myApp" ng-controller="dateCtrl">
Today is {{today | utcDate}}
</div>
声明过滤器的方式是否可行?
app.filter('dateUTC', function ($filter) {
return function (input, format) {
if (!angular.isDefined(format)) {
format = 'dd/MM/yyyy';
}
var date = new Date(input);
return $filter('date')(date.toISOString().slice(0, 23), format);
};
});
<system.web>
将解决您的问题:
<globalization culture="auto:en-US" uiCulture="auto:en-US" />