“ คำเตือนการเลิกใช้งาน: การสร้างช่วงเวลากลับเป็น js Date” เมื่อพยายามแปลงวันที่ RFC2822 เป็นโมฆะ


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 ของคุณในรูปแบบ ISO:

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

  • ส่งผ่านสายอักขระที่คุณมีตอนนี้ แต่บอกช่วงเวลาว่ารูปแบบสายอักขระมีอะไรบ้าง:

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

  • แปลงสตริงของคุณเป็นออบเจ็กต์วันที่ของ JavaScript จากนั้นส่งต่อไปยังช่วงเวลา:

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

ตัวเลือกสุดท้ายคือทางเลือกในตัวที่ Moment รองรับในตอนนี้พร้อมคำเตือนคอนโซลที่เลิกใช้แล้ว พวกเขากล่าวว่าพวกเขาจะไม่สนับสนุนทางเลือกนี้ในการเผยแพร่ในอนาคต พวกเขาอธิบายว่าการใช้new Date('my date')ไม่แน่นอนเกินไป


36
ข้อความใด ๆ ในสัญลักษณ์แสดงหัวข้อย่อยในคำตอบข้างต้นจะทำให้ข้อความเตือนการเลิกใช้งานที่ดีกว่าข้อความที่สร้างความสับสนให้กับคำถามนี้
จะ

2
ใช้moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());ok ไหม หรือฉันแค่ระงับปัญหาที่พร้อมจะพังอย่างเงียบ ๆ ในอนาคตอันใกล้เช่นนี้?
Bruno Finger

นอกจากนี้คุณยังสามารถมีข้อความนี้หากค่าที่ส่งผ่านมีอักขระพิเศษที่นำหน้าหรือต่อท้ายเช่นช่องว่าง โดยทั่วไปแล้วจะไปกับInvalidผลลัพธ์วันที่
Guillaume Renoult

@BrunoFinger ที่ควรทำงาน Date () และ toISOString () เป็นสิ่ง JavaScript ไม่ใช่สิ่งช่วงเวลา
Joe Wilson

หากคุณไม่มีทางเลือกเกี่ยวกับวิธีการระบุวันที่ฉันขอแนะนำสัญลักษณ์แสดงหัวข้อย่อยที่สองโดยระบุรูปแบบของสตริงวันที่ มันขจัดความกำกวมที่สุด
Joshua Pinter

50

คุณสามารถระงับการแสดงคำเตือนการคัดค้านโดยการตั้งค่า moment.suppressDeprecationWarnings = true;


สำหรับ TypeScript คุณอาจต้องนำหน้าด้วย// @ts-ignore(อย่างน้อยสำหรับบางช่วงเวลาในโซนเวลาและ @ ประเภท / ช่วงเวลาในขณะนั้น)
TrueWill

7

การสร้างวันที่momentภายในใช้new Date()ในจาวาสคริปต์ การnew Date()ก่อสร้างรับรู้สตริงวันที่ในรูปแบบRFC2822หรือISOในเบราว์เซอร์ทั้งหมด เมื่อสร้างmomentวัตถุที่มีวันที่ไม่ได้อยู่ในรูปแบบเหล่านี้คำเตือนการคัดค้านจะถูกส่งออกไป

แม้ว่าจะมีการโยนคำเตือนเรื่องการคัดค้าน แต่สำหรับบางรูปแบบmomentวัตถุจะสร้างสำเร็จใน Chrome แต่ไม่ใช่ใน Firefox หรือ Safari ด้วยเหตุนี้การประมวลผลวันที่ใน Chrome จึงอาจให้ผลลัพธ์ตามที่คาดหวัง (ไม่ใช่ทุกเวลา) และส่งไปให้Invalid Dateผู้อื่น

พิจารณา02.02.2018,

Chrome - 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

Safari - 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

หากวันที่ของคุณถูกส่งถึงคุณจาก API เป็นstring(เช่นปัญหาของฉัน) คุณสามารถใช้ตัวกรองเพื่อแปลงสตริงเป็นวันที่สักครู่ สิ่งนี้จะดูแลเตือนการก่อสร้างช่วงเวลา

$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.