Moment.js'deki RFC2822 tarihini dönüştürmeye çalışırken "kullanımdan kaldırma uyarısı: an yapımı js Date'e geri dönüyor"


164

Moment.js kullanarak yerel saate bir sunucu tarafı tarih-saat dönüştürmek için aşağıdaki kodu kullanıyorum.

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

Ama alıyorum:

Kullanımdan kaldırma uyarısı: an inşaat js Date'ye geri döner. Bu cesaretiniz kırıldı ve gelecek büyük sürümde kaldırılacak. Daha fazla bilgi için lütfen https://github.com/moment/moment/issues/1407 adresine bakın .

Ondan kurtulamıyorum gibi görünüyor! Nasıl düzeltebilirim?


bunun nerede olduğunu söylediğini okudun mu?
toesslab

7
Tabii ki okuyorum !! ama ya şaşkınım ve herhangi bir çözüm getiremedim ya da orada herhangi bir çözüm yoktu!
dariush

Orada biraz okuduktan sonra, aylar önce tartışılan gerçek bir sorun gibi görünüyor ... Başka bir araç al ...
toesslab

Yanıtlar:


315

Uyarıdan kurtulmak için şunlardan birini yapmanız gerekir:

  • Tarih dizenizin ISO biçimli bir sürümünü iletin:

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

  • Şimdi sahip olduğunuz dizeyi iletin, ancak Moment'e dizenin hangi formatta olduğunu söyleyin:

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

  • Dizenizi bir JavaScript Tarihi nesnesine dönüştürün ve ardından An'a iletin:

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

Son seçenek, kullanımdan kaldırılan konsol uyarısı ile Moment'in şimdilik desteklediği yerleşik bir yedek. Gelecek sürümlerde bu düşüşü desteklemeyeceklerini söylüyorlar. Kullanımın new Date('my date')çok öngörülemez olduğunu açıklıyorlar .


36
Yukarıdaki yanıttaki madde işaretlerindeki metinlerden herhangi biri, bu soruyu başlatan kafa karıştırıcı olandan çok daha iyi bir kullanımdan kaldırma mesajı gönderecektir.
Will

2
Kullanıyor moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());tamam mı? Yoksa yakın gelecekte sessizce çökmeye hazır bir sorunu bastırıyor muyum?
Bruno Finger

Bu iletiye, iletilen değer boşluk gibi önde gelen veya sondaki fazladan karakterler içeriyorsa da ulaşabilirsiniz. Genellikle bir Invalidtarih sonucuyla gider .
Guillaume Renoult

@BrunoFinger çalışması gerekir. Date () ve toISOString (), Moment değil, JavaScript şeyleridir.
Joe Wilson

Tarihin nasıl sağlandığı konusunda bir seçeneğiniz yoksa, tarih Dize biçimini belirterek ikinci madde işaretini öneririm. En belirsizliği ortadan kaldırır.
Joshua Pinter

50

Alternatif olarak, kullanımdan kaldırma uyarısını göstererek moment.suppressDeprecationWarnings = true;


TypeScript için bundan önce gelmeniz gerekebilir // @ts-ignore(en azından moment-saat diliminin ve @ tipler / moment-saat diliminin bazı sürümleri için).
TrueWill

7

Inşaat tarihi momentdahili new Date()olarak javascript kullanır . new Date()İnşaat olabilen bir tarih dizesi tanır RFC2822 veya ISO tüm tarayıcılarda formatları. momentTarihi bu biçimlerde olmayan bir nesne oluştururken, kullanımdan kaldırma uyarısı verilir.

Kullanımdan kaldırma uyarıları atılsa da, bazı biçimler için momentnesne Chrome'da başarılı bir şekilde oluşturulacak, ancak Firefox veya Safari'de oluşturulamayacak. Bu nedenle, Chrome'da tarihin işlenmesi sonuçları beklendiği gibi (her zaman değil) verebilir ve Invalid Datebaşkalarına atar .

Düşünün 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

Bu nedenle, moment.jsönerilen / standart biçimlerin kullanılmaması durumunda kendi sorumluluğunuzdadır.

Kullanımdan kaldırma uyarılarını bastırmak için ,

  1. Önceki cevapta @Joe Wilson tarafından önerildiği gibi, momentyapım tarih formatını veriniz .

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

  1. Tarihi ISO veya RFC2822 formatında verin.

Örnek: moment("2018-02-01T18:30:00.000Z")- ISO Biçimi

moment("Thu, 01 Feb 2018 18:30:00 GMT")- RFC2822 Formatı - Github Biçim

  1. Önceki yanıtta @niutech tarafından önerildiği gibi,

moment.suppressDeprecationWarnings = true;

  1. Anında giriş yedeklerinin üzerine yazmanızı öneririm.

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

(3) tüm uyarıları kaldıracağından, (4) yalnızca inşaatın geri dönüş tarihini bastıracaktır. (4) kullanarak Invalid Date, dahili new Date()olarak kullanıldıkça ve diğer kullanım dışı bırakmalar konsolda görülebilir, böylece an yükseltilebilir veya kullanımdan kaldırılan yöntemler uygulamada değiştirilebilir.


3

Tarihiniz string(benim sorunum gibi) bir API'dan size iletilirse , dizeyi bir tarihe dönüştürmek için bir filtre kullanabilirsiniz. Bu, an inşaat uyarısı ile ilgilenecektir.

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

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

Görünüme ekleyin:

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

0

Yukarıdaki cevaplarda belirtildiği gibi. Tarih biçiminin sağlanması çalışmalıdır.

Neden aşağıdaki kod satırı ile kullanımdan kaldırma mesajı alıyorum. Ben String + formatı sorunu çözmek için varsayalım düşündüm. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). Ayrıca, lütfen sağlanmakta olan tarih formatı üzerinde kontrolüm yok. Ben kendim 'YYYY-MM-DDTHH:mm:ss'o zaman anımsama mesajı göstermez dönüştürmek biliyorum . Ancak, belgelere göre, kod satırı çalışmalıdır. İşte gördüğüm itiraz mesajı.

"Kullanımdan kaldırma uyarısı: sağlanan değer tanınan bir RFC2822 veya ISO biçiminde değil. Moment yapısı tüm tarayıcılarda ve sürümlerde güvenilir olmayan js Date () 'e geri döner. RFC2822 / ISO olmayan tarih biçimleri önerilmez ve Yakında çıkacak olan büyük sürüm. Daha fazla bilgi için lütfen http://momentjs.com/guides/#/warnings/js-date/ adresine bakın . "

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.