[javascript] moment.js에서 RFC2822 날짜를 변환하려고 할 때“사용 중단 경고 : 모멘트 생성이 js 날짜로 되돌아 감”

moment.js를 사용하여 서버 측 날짜 시간을 현지 시간으로 변환하려면 다음 코드를 사용하고 있습니다.

 moment(moment('Wed, 23 Apr 2014 09:54:51 +0000').format('lll')).fromNow()

그러나 나는 얻고있다 :

지원 중단 경고 : 모멘트 생성이 js Date로 폴백합니다. 이것은 권장되지 않으며 향후 주요 릴리스에서 제거 될 예정입니다. 자세한 내용은 https://github.com/moment/moment/issues/1407 을 참조하십시오 .

제거 할 수없는 것 같습니다! 어떻게 고칠 수 있습니까?



답변

경고를 없애려면 다음 중 하나를 수행해야합니다.

  • 날짜 형식의 ISO 형식 버전을 전달하십시오.

    moment('2014-04-23T09:54:51');

  • 지금 가지고있는 문자열을 전달하되, 문자열이 어떤 형식인지 Moment에 알려주십시오.

    moment('Wed, 23 Apr 2014 09:54:51 +0000', 'ddd, DD MMM YYYY HH:mm:ss ZZ');

  • 문자열을 JavaScript Date 객체로 변환 한 다음 Moment에 전달하십시오.

    moment(new Date('Wed, 23 Apr 2014 09:54:51 +0000'));

마지막 옵션은 더 이상 사용되지 않는 콘솔 경고와 함께 Moment가 현재 지원하는 기본 폴백입니다. 그들은 향후 릴리스에서이 대체를 지원하지 않을 것이라고 말합니다. 그들은 사용 new Date('my date')이 너무 예측할 수 없다고 설명합니다 .


답변

대안으로, 설정하여 사용 중단 경고가 표시되지 않도록 할 수 있습니다 moment.suppressDeprecationWarnings = true;


답변

날짜 구성은 moment내부적으로 new Date()자바 스크립트를 사용합니다 . new Date()구조는 하나의 날짜 문자열 인식 RFC2822 또는 ISO 모든 브라우저에서 형식을. moment이러한 형식이 아닌 날짜를 가진 객체를 구성 할 때 사용 중단 경고가 발생합니다.

지원 중단 경고가 표시되지만 일부 형식의 경우 moment객체가 Chrome에서는 성공적으로 생성되지만 Firefox 또는 Safari에서는 생성되지 않습니다. 이로 인해 Chrome에서 날짜를 처리하면 항상 예상대로 결과가 나오고 다른 경우가 발생할 수 Invalid Date있습니다.

다음을 고려하십시오 02.02.2018.

크롬– moment("02.02.2018")._d>Fri Feb 02 2018 00:00:00 GMT+0530 (India Standard Time)

Firefox– moment("02.02.2018")._d>Invalid Date

사파리– moment("02.02.2018")._d>Invalid Date

따라서 moment.js권장 / 표준 형식을 사용하지 않는 경우에는 위험을 감수해야합니다.

사용 중단 경고를 억제하려면 ,

  1. 이전 답변에서 @Joe Wilson이 제안한 것처럼 moment건설 날짜 형식을 지정하십시오 .

예 : moment("02.05.2018", "DD.MM.YYYY").format("DD MM YYYY");

  1. ISO 또는 RFC2822 형식으로 날짜를 제공하십시오.

예 : moment("2018-02-01T18:30:00.000Z")-ISO 형식

moment("Thu, 01 Feb 2018 18:30:00 GMT")– RFC2822 형식 – Github에서의 형식

  1. 이전 답변에서 @niutech이 제안한대로 설정하십시오.

moment.suppressDeprecationWarnings = true;

  1. 입력 폴백을 즉시 덮어 쓰는 것이 좋습니다.

    moment.createFromInputFallback=function (config){
        config._d = new Date(config._i);
    }

(3)은 모든 경고를 억제하므로 (4)는 날짜 구성 폴 백만 억제합니다. (4)를 사용 Invalid Date하면 내부 new Date()를 사용하고 콘솔에서 다른 지원 중단을 볼 수 있으므로 순간을 업그레이드하거나 더 이상 사용되지 않는 방법을 응용 프로그램에서 바꿀 수 있습니다.


답변

string내 문제처럼 API에서 날짜가 전달 되면 필터를 사용하여 문자열을 잠시 날짜로 변환 할 수 있습니다. 이것은 순간 건설 경고를 처리합니다.

$scope.apiDate = 10/29/2017 18:28:03";

angular.module('myApp').filter('stringToDate', function() {
  return function(value) {
     return Date.parse(value);
  };
});

보기에 추가하십시오.

{{apiDate | stringToDate | amDateFormat:'ddd, MMM DD'}}


답변

위의 답변에 표시된대로. 날짜 형식을 제공하면 작동합니다.

다음 코드 줄과 함께 사용 중단 메시지가 표시되는 이유는 무엇입니까? String + 형식이 문제를 해결한다고 가정했습니다. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). 또한 제공되는 날짜 형식을 제어 할 수 없습니다. 나는 내가 그것을 직접 변환 할 수 있다는 것을 알고있다 'YYYY-MM-DDTHH:mm:ss'. 그러나 설명서에 따르면 코드 줄이 작동해야합니다. 다음은 제가보고있는 지원 중단 메시지입니다.

“사용 중단 경고 : 제공된 값이 인식 된 RFC2822 또는 ISO 형식이 아닙니다. 모멘트 구성은 모든 브라우저와 버전에서 신뢰할 수없는 js Date ()로 돌아갑니다. RFC2822 / ISO 날짜 형식 이외의 형식은 사용하지 않는 것이 좋습니다. 향후 주요 릴리스입니다. 자세한 내용은 http://momentjs.com/guides/#/warnings/js-date/ 를 참조하십시오
. “


답변