Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将webapi返回的字符串格式的日期转换为AngularJs的javascript日期格式_Angularjs_Date_Asp.net Web Api_Momentjs_Angular Moment - Fatal编程技术网

如何将webapi返回的字符串格式的日期转换为AngularJs的javascript日期格式

如何将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标准的正则表达式,但是对于我使用的每一种正则表达式,都有大量的用例失败。我要求的个案如下: 不应转换非日期(字符串),例如' 不应转换非日期

我有许多.net webApi操作返回反序列化为JSON的日期。然后,我的angular应用程序使用这些日期字符串进行显示\编辑,或作为各种日期指令中的ngModel。其中许多指令需要javascript日期对象,而不是日期的字符串表示形式。如何将所有返回的webapi数据的日期字符串序列化回javascript日期

注意:我已经尝试过多种符合ISO8601标准的正则表达式,但是对于我使用的每一种正则表达式,都有大量的用例失败。我要求的个案如下:

  • 不应转换非日期(字符串),例如'
  • 不应转换非日期(整数),例如2015年
  • 不应转换错误日期,例如“2009-05-19T14a39r”
  • 不应将部分错误日期从字符串转换为日期,例如“1”
  • 不应转换看起来像一年的字符串,例如“2015”
  • 应将日期从字符串转换为日期,例如“2015-09-09”
  • 应将带时间的日期从字符串转换为带时间的日期,例如“2009-05-19T14:39”
  • 应将带时间的日期从字符串转换为带时间的日期(包括秒),例如“2009-05-19T14:39:23”

  • 应将带时间的日期从字符串转换为带时间的日期(毫秒),例如“2016-06-09T13:02:39.957”

  • 应将带有时间的日期从字符串转换为带有UTC时间的日期,例如“2009-05-19T14:39Z”

  • 不应转换属于较长字符串的日期,例如“不应转换2015-12-12T00:00:00Z,因为这是较长字符串的一部分”


  • 因此,首先,为了截取并将所有字符串日期转换为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;
    
    }