我们应用程序的用户必须选择他们想要工作的时区。这是因为他们可能只为其他时区的客户工作。
然后将应用的日期存储在UTC中。
Javascript在将utc日期显示为本地日期时采用浏览器的时区偏移量,这不是我想要的。
为了显示日期,我有一个适当的过滤器。它采用由于浏览器而应用的偏移量并将其删除。然后应用用户定义的偏移量。这适用于显示值。
一个示例可能是:用户坐在UTC+03:00中,但他在应用程序中的设置是针对UTC-4:00。在数据库中,UTC值为6 6am所需的显示值为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)将最终出现在作用域中,并覆盖原始值6am我可以看到,当我将值改为3,然后又变为2时,有没有办法处理这个问题?例如,当dom元素改变时,控制在作用域中设置什么。
发布于 2017-04-27 16:03:12
最后,我使用了一个指令来处理视图中的值被更新时的情况
指令
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 >
https://stackoverflow.com/questions/43637729
复制相似问题