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


164

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

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

그러나 나는 얻고있다 :

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

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


어디에서 그렇게했는지 읽었습니까?
toesslab

7
물론 나는 읽었다!! 그러나 혼란스럽고 솔루션을 가져올 수 없거나 솔루션이 전혀 없습니다!
dariush

약간의 내용을 읽은 후 몇 달 전에 논의 된 실제 문제인 것 같습니다 ... 다른 도구를 사용하십시오 ...
toesslab

답변:


315

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

  • 날짜 형식의 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')이 너무 예측할 수 없다고 설명합니다 .


36
위 답변의 글 머리 기호에있는 텍스트는이 질문을 시작한 혼란스러운 텍스트보다 더 나은 사용 중단 경고 메시지를 만듭니다.
Will

2
확인을 사용하고 moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());있습니까? 아니면 가까운 미래에 조용히 충돌 할 준비가 된 문제를 억제하고 있습니까?
Bruno Finger

전달 된 값에 공백과 같은 선행 또는 후행 추가 문자가 포함 된 경우에도이 메시지를 가질 수 있습니다. 그것은 일반적으로 Invalid날짜 결과 와 함께 간다 .
기 illa 르노 울트

@BrunoFinger 작동합니다. Date () 및 toISOString ()은 Moment가 아닌 JavaScript입니다.
Joe Wilson

날짜를 제공하는 방법을 선택할 수 없다면 날짜 문자열의 형식을 지정하여 두 번째 글 머리 기호를 사용하는 것이 좋습니다. 가장 모호성을 제거합니다.
Joshua Pinter

50

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


TypeScript의 경우 (앞으로 // @ts-ignore일부 버전의 moment-timezone 및 @ types / moment-timezone) 이 앞에 와야 할 수도 있습니다 .
TrueWill

7

날짜 구성은 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()를 사용하고 콘솔에서 다른 지원 중단을 볼 수 있으므로 순간을 업그레이드하거나 더 이상 사용되지 않는 방법을 응용 프로그램에서 바꿀 수 있습니다.


3

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'}}

0

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

다음 코드 줄과 함께 사용 중단 메시지가 표시되는 이유는 무엇입니까? 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/ 를 참조하십시오 . "

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.