"Peringatan penghentian: konstruksi saat kembali ke Tanggal js" ketika mencoba mengubah tanggal RFC2822 di moment.js

164

Saya menggunakan kode berikut untuk mengonversi waktu-sisi-sisi server ke waktu lokal menggunakan moment.js.

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

Tapi saya mendapatkan:

Peringatan penghentian: saat konstruksi jatuh kembali ke Tanggal js. Ini tidak disarankan dan akan dihapus dalam rilis besar mendatang. Silakan merujuk ke https://github.com/moment/moment/issues/1407 untuk info lebih lanjut.

Sepertinya saya tidak bisa menyingkirkannya! Bagaimana saya bisa memperbaikinya?

dariush
sumber
Apakah Anda membaca di mana dikatakan untuk melakukannya?
toesslab
7
Tentu saja saya baca !! tapi entah saya bingung dan tidak bisa mengambil solusi atau tidak ada solusi di sana sama sekali!
dariush
Setelah membaca sedikit di sana, tampaknya menjadi masalah nyata, yang telah dibahas bulan lalu ... Ambil alat lain ...
toesslab

Jawaban:

315

Untuk menghilangkan peringatan, Anda harus:

  • Lulus versi ISO yang diformat dari string tanggal Anda:

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

  • Lewati string yang Anda miliki sekarang, tetapi beri tahu Moment apa format string tersebut:

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

  • Konversikan string Anda ke objek Tanggal JavaScript dan kemudian kirimkan ke Moment:

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

Opsi terakhir adalah built-in fallback yang didukung Moment untuk saat ini, dengan peringatan konsol yang sudah usang. Mereka mengatakan mereka tidak akan mendukung fallback ini di rilis mendatang. Mereka menjelaskan bahwa menggunakan new Date('my date')itu terlalu tidak terduga.

Joe Wilson
sumber
36
Teks mana pun dalam peluru di jawaban di atas akan membuat pesan peringatan penghinaan yang jauh lebih baik daripada yang membingungkan yang memulai pertanyaan ini.
Will
2
Apakah menggunakan moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());ok? Atau apakah saya hanya menekan masalah yang siap untuk crash secara diam-diam dalam waktu dekat seperti ini?
Bruno Finger
Anda juga dapat memiliki pesan ini jika nilai yang diteruskan berisi karakter tambahan awal atau tambahan, seperti spasi. Biasanya berjalan dengan Invalidhasil tanggal.
Guillaume Renoult
@ BrunoFinger yang seharusnya bekerja. Date () dan toISOString () adalah hal JavaScript, bukan barang Moment.
Joe Wilson
Jika Anda tidak memiliki pilihan tentang bagaimana tanggal disediakan, saya akan merekomendasikan titik peluru kedua, menentukan format String tanggal. Ini menghilangkan ambiguitas paling banyak.
Joshua Pinter
50

Sebagai alternatif, Anda dapat menekan menampilkan peringatan penghentian dengan mengatur moment.suppressDeprecationWarnings = true;

niutech
sumber
Untuk TypeScript, Anda mungkin harus mengawali ini dengan // @ts-ignore(setidaknya untuk beberapa versi moment-timezone dan @ types / moment-timezone).
TrueWill
7

Konstruksi tanggal di momentinternal menggunakan new Date()javascript. The new Date()konstruksi mengakui string tanggal baik RFC2822 atau ISO format di semua browser. Saat membangun amoment objek dengan tanggal tidak dalam format ini, peringatan penghentian dilemparkan.

Meskipun peringatan penghentian dilemparkan, untuk beberapa format, momentobjek akan berhasil dibangun di Chrome, tetapi tidak di Firefox atau Safari. Karena itu, memproses tanggal di Chrome dapat memberikan hasil seperti yang diharapkan (tidak setiap saat) dan melemparInvalid Date lain.

Mempertimbangkan, 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

Jadi moment.jsdigunakan dengan risiko Anda sendiri jika format yang direkomendasikan / standar tidak digunakan.

Untuk menekan peringatan penghentian ,

  1. Seperti yang disarankan oleh @ Jo Wilson dalam jawaban sebelumnya, berikan format tanggal pada momentkonstruksi.

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

  1. Berikan tanggal dalam format ISO atau RFC2822.

Contoh: moment("2018-02-01T18:30:00.000Z")- Format ISO

moment("Thu, 01 Feb 2018 18:30:00 GMT")- Format RFC2822 - Format dalam Github

  1. Seperti yang disarankan oleh @niutech dalam jawaban sebelumnya, atur

moment.suppressDeprecationWarnings = true;

  1. Saya menyarankan untuk menimpa input fallback pada saat itu.

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

Karena (3) akan menekan semua peringatan, (4) hanya akan menekan mundurnya tanggal konstruksi. Menggunakan (4), Anda akan mendapatkan Invalid Datekarena internal new Date()digunakan dan penghentian lainnya dapat dilihat di konsol, sehingga momen dapat ditingkatkan atau metode yang sudah usang dapat diganti dalam aplikasi.

Vignesh Raja
sumber
3

Jika tanggal Anda dikirimkan kepada Anda dari API sebagai string(seperti masalah saya), Anda dapat menggunakan filter untuk mengonversi string menjadi tanggal untuk saat ini. Ini akan menangani peringatan saat konstruksi.

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

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

Tambahkan ke tampilan:

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

Seperti ditunjukkan dalam jawaban di atas. Menyediakan format tanggal harus bekerja.

Mengapa saya menerima pesan penghinaan dengan baris kode berikut. Saya pikir format String + seharusnya untuk memperbaiki masalah ini. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). Juga, tolong jangan saya tidak memiliki kontrol atas format tanggal yang disediakan. Saya tahu saya bisa mengonversinya sendiri 'YYYY-MM-DDTHH:mm:ss'sehingga saat itu tidak menunjukkan pesan penghentian. Namun, menurut dokumentasi, garis kode harus berfungsi. Inilah pesan penghinaan yang saya lihat.

"Peringatan penghentian: nilai yang diberikan tidak dalam format RFC2822 atau ISO yang diakui. Saat konstruksi jatuh kembali ke js Date (), yang tidak dapat diandalkan di semua browser dan versi. Format tanggal RFC2822 / ISO tidak disarankan dan akan dihapus dalam format rilis besar mendatang. Silakan merujuk ke http://momentjs.com/guides/#/warnings/js-date/ untuk info lebih lanjut. "

pengguna2027058
sumber