我有许多.net webApi操作,它们返回反序列化为JSON的日期。然后,我的angular应用程序将这些日期字符串用于显示\ edit或作为各种日期指令中的ngModel使用。这些指令中的许多指令都需要javascript日期对象,而不是日期的字符串表示形式。如何将所有返回的webapi数据的日期字符串序列化回javascript日期?
注意:我已经尝试了各种符合ISO 8601的正则表达式,但是我使用的每一个正则表达式都有很多失败的用例。我要求的情况如下:
应该将日期和时间从字符串转换为日期和时间(包括秒),例如'2009-05-19T14:39:23'
应该将日期和时间转换为毫秒,从字符串转换为日期和时间转换为毫秒,例如“ 2016-06-09T13:02:39.957”
应该在UTC中将带日期的日期从字符串转换为带时间的日期,例如'2009-05-19T14:39Z'
不应转换较长字符串的一部分的日期,例如“不应转换2015-12-12T00:00:00Z,因为这是较长字符串的一部分”
因此,首先,为了将所有字符串日期截取并将其转换为javascript日期,我们需要angular来进行截取和替换。为此,我们可以在httpProvider上使用拦截器,以确保在执行任何其他代码之前,我们的代码可在所有返回的http响应上运行。
var app = angular.module('app');
app.config(configureProviders);
configureProviders.$inject = ['$httpProvider'];
function configureProviders($httpProvider) {
configureHttp($httpProvider);
}
function configureHttp(httpProvider) {
// add all http interceptors
httpProvider.interceptors.push('dateDeserialiserInterceptor');
}
好的,所以现在我们已经注册了拦截器,但是我们需要一些代码来使其工作:
(function () {
var module = angular.module('myApp.interceptors');
module.factory('dateDeserialiserInterceptor', function () {
function convertDateStringsToDates(input) {
// Ignore things that aren't objects.
if (typeof input !== "object") return input;
for (var key in input) {
if (!input.hasOwnProperty(key)) continue;
var value = input[key];
// Check for string properties which look like dates.
if (typeof value === "string" && (moment(value, moment.ISO_8601).isValid())) {
input[key] = moment(value, moment.ISO_8601).toDate();
} else if (typeof value === "object") {
// Recurse into object
convertDateStringsToDates(value);
}
}
};
return {
response: function (response) {
convertDateStringsToDates(response);
return response;
}
};
});
})();
因此,以上代码最初是从某个地方的Internet上删除的,并进行了手动regEx比较。regEx被描述为符合ISO 8601,但我发现了许多不符合该标准的示例。现在,这依赖于开源库momentJs来确定日期是否符合ISO 8601并进行转换。如果日期不符合要求,则仅返回字符串值。ISO 8601是一个很好的使用标准(因为它涵盖了许多情况),比硬编码任何预期的特定格式要好得多,因为这可能会导致您走上“哦……不见了”的道路。
目前,它正在解析所有返回的响应对象值以获取潜在日期。我考虑过通过使用我们期望是日期的响应属性显式标记请求来改善此问题。这样,我们就不必尝试\解析所有内容(这很慢),并且也冒着我们不想转换的内容被转换的风险。但是,这种方法有点混乱,会乱扔很多请求。我暂时喜欢这种方法,而且似乎可行。很高兴它得到改善!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句