如何将webapi返回的字符串格式的日期转换为AngularJs的javascript日期格式
我有许多.net webApi操作返回反序列化为JSON的日期。然后,我的angular应用程序使用这些日期字符串进行显示\编辑,或作为各种日期指令中的ngModel。其中许多指令需要javascript日期对象,而不是日期的字符串表示形式。如何将所有返回的webapi数据的日期字符串序列化回javascript日期 注意:我已经尝试过多种符合ISO8601标准的正则表达式,但是对于我使用的每一种正则表达式,都有大量的用例失败。我要求的个案如下:如何将webapi返回的字符串格式的日期转换为AngularJs的javascript日期格式,angularjs,date,asp.net-web-api,momentjs,angular-moment,Angularjs,Date,Asp.net Web Api,Momentjs,Angular Moment,我有许多.net webApi操作返回反序列化为JSON的日期。然后,我的angular应用程序使用这些日期字符串进行显示\编辑,或作为各种日期指令中的ngModel。其中许多指令需要javascript日期对象,而不是日期的字符串表示形式。如何将所有返回的webapi数据的日期字符串序列化回javascript日期 注意:我已经尝试过多种符合ISO8601标准的正则表达式,但是对于我使用的每一种正则表达式,都有大量的用例失败。我要求的个案如下: 不应转换非日期(字符串),例如' 不应转换非日期
因此,首先,为了截取并将所有字符串日期转换为javascript日期,我们需要进行截取和替换。为此,我们可以在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;
}
};
});
})();
因此,上面的代码最初是从互联网上的某个地方删除的,并进行了手动正则表达式比较。regEx被描述为符合iso8601标准,但我发现有很多例子都不符合。现在,这依赖于确定日期是否符合要求并进行转换。如果日期不符合,只返回字符串值。ISO 8601是一个很好的使用标准(因为它涵盖了许多情况),并且比硬编码任何预期的特定格式要好得多,这可能会导致您走上“哦……它错过了一个”的道路
目前,它正在解析所有返回的响应对象值,以确定可能的日期。我考虑通过显式地用我们期望的响应属性标记请求来改进这一点。这样一来,我们就不必尝试解析所有内容(速度很慢),也不必冒我们不想转换的内容被转换的风险。然而,这种方法有点混乱,会造成许多请求。我现在喜欢这种方法,而且似乎很有效。很高兴它有所改进 这是一个角度为2+的解决方案。这假设API中的日期为ISO格式: 在您的组件中:
// call to your data service
this.dataService.getSomeData().map(records => {
records.map(record => {
//call to shared service date conversion function
this.dataService.covertISOFieldstoDateObjects(record);
});
return records;
}).subscribe(x => {
// processed records will now have date objects for any date properties
this.records = x;
}, error => {
...
});
为您服务:
covertISOFieldstoDateObjects(currentObj) {
const entries = Object.entries(currentObj);
for (const [key, value] of entries) {
const isDate = moment(value, moment.ISO_8601).isValid();
if (isDate) {
currentObj[key] = moment(value as string, 'YYYY-MM-DD HH:mm'); // Use this to get UTC and ignore timezone (good when you need just the date)
currentObj[key] = moment(value as string, 'YYYY-MM-DD HH:mmZ'); // Use this to include timezone adjustment
}
}
return currentObj;
}