Cảnh báo không dùng nữa


164

Tôi đang sử dụng đoạn mã sau để chuyển đổi thời gian ngày ở phía máy chủ sang giờ địa phương bằng cách sử dụng khoảnh khắc.

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

Nhưng tôi đang nhận được:

Cảnh báo khấu hao: thời điểm xây dựng rơi vào ngày js. Điều này không được khuyến khích và sẽ được gỡ bỏ trong phiên bản chính sắp tới. Vui lòng tham khảo https://github.com/moment/moment/issues/1407 để biết thêm thông tin.

Có vẻ như tôi không thể thoát khỏi nó! Làm thế nào tôi có thể sửa chữa nó?


Bạn đã đọc nơi mà nó nói để làm như vậy?
toesslab

7
Tất nhiên tôi đã đọc !! nhưng hoặc tôi bối rối và không thể tìm thấy bất kỳ giải pháp nào hoặc không có bất kỳ giải pháp nào trong đó cả!
dariush

Sau khi đọc một chút ở đó, nó dường như là một vấn đề thực sự, đã được thảo luận nhiều tháng trước ... Hãy sử dụng một công cụ khác ...
toesslab

Câu trả lời:


315

Để thoát khỏi cảnh báo, bạn cần phải:

  • Chuyển qua một phiên bản định dạng ISO của chuỗi ngày của bạn:

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

  • Chuyển qua chuỗi bạn có bây giờ, nhưng hãy nói cho Moment biết định dạng của chuỗi đó là gì:

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

  • Chuyển đổi chuỗi của bạn thành một đối tượng Ngày JavaScript và sau đó chuyển chuỗi đó thành Khoảnh khắc:

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

Tùy chọn cuối cùng là một dự phòng tích hợp mà Moment hỗ trợ cho đến thời điểm hiện tại, với cảnh báo giao diện điều khiển không dùng nữa. Họ nói rằng họ sẽ không hỗ trợ dự phòng này trong các phiên bản tương lai. Họ giải thích rằng việc sử dụng new Date('my date')là quá khó lường.


36
Bất kỳ văn bản nào trong các gạch đầu dòng trong câu trả lời ở trên sẽ tạo ra một thông điệp cảnh báo phản đối tốt hơn nhiều so với thông điệp khó hiểu bắt đầu câu hỏi này.
Sẽ

2
Sử dụng có moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());ổn không? Hay tôi chỉ đang khắc phục một vấn đề sẵn sàng âm thầm sụp đổ trong tương lai gần như thế này?
Bruno Finger

Bạn cũng có thể có thông báo này nếu giá trị được truyền có chứa các ký tự phụ dẫn đầu hoặc theo dõi, chẳng hạn như khoảng trắng. Nó thường đi với một Invalidkết quả ngày.
Guillaume Renoult

@BrunoFinger nên hoạt động. Ngày () và toISOString () là những thứ JavaScript, không phải là những thứ khoảnh khắc.
Joe Wilson

Nếu bạn không có lựa chọn về cách cung cấp ngày, tôi khuyên bạn nên sử dụng dấu đầu dòng thứ hai, chỉ định định dạng của Chuỗi ngày. Nó loại bỏ sự mơ hồ nhất.
Joshua Pinter

50

Thay vào đó, bạn có thể ngăn chặn hiển thị cảnh báo khấu hao bằng cách đặt moment.suppressDeprecationWarnings = true;


Đối với TypeScript, bạn có thể phải đi trước điều này với // @ts-ignore(ít nhất là đối với một số phiên bản của múi giờ thời gian và @ loại / thời gian-thời gian).
TrueWill

7

Việc xây dựng ngày trong momentnội bộ sử dụng new Date()trong javascript. Cấu new Date()trúc nhận ra chuỗi ngày ở các định dạng RFC2822 hoặc ISO trong tất cả các trình duyệt. Khi xây dựng một momentđối tượng có ngày không ở các định dạng này, cảnh báo không dùng nữa sẽ bị ném.

Mặc dù các cảnh báo không dùng nữa được đưa ra, nhưng đối với một số định dạng, momentđối tượng sẽ được xây dựng thành công trong Chrome, nhưng không phải trong Firefox hoặc Safari. Do đó, việc xử lý ngày trong Chrome có thể cho kết quả như mong đợi (không phải tất cả thời gian) và ném Invalid Datevào người khác.

Hãy xem xét 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

Vì vậy, moment.jsrủi ro được sử dụng là của riêng bạn trong trường hợp các định dạng được đề xuất / tiêu chuẩn không được sử dụng.

Để ngăn chặn các cảnh báo khấu hao ,

  1. Theo đề xuất của @Joe Wilson trong câu trả lời trước, hãy đưa ra định dạng ngày về momentxây dựng.

Thí dụ : moment("02.05.2018", "DD.MM.YYYY").format("DD MM YYYY");

  1. Đưa ra ngày ở định dạng ISO hoặc RFC2822.

Ví dụ: moment("2018-02-01T18:30:00.000Z")- Định dạng ISO

moment("Thu, 01 Feb 2018 18:30:00 GMT")- Định dạng RFC2822 - Định dạng trong Github

  1. Theo đề xuất của @niutech trong câu trả lời trước, hãy đặt

moment.suppressDeprecationWarnings = true;

  1. Tôi đề nghị ghi đè dự phòng đầu vào trong thời điểm này.

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

Vì (3) sẽ triệt tiêu tất cả các cảnh báo, (4) sẽ chỉ triệt tiêu dự phòng ngày xây dựng. Sử dụng (4), bạn sẽ nhận được Invalid Datenội bộ new Date()được sử dụng và có thể thấy các khấu hao khác trong bảng điều khiển, do đó có thể nâng cấp khoảnh khắc hoặc các phương thức không dùng nữa trong ứng dụng.


3

Nếu ngày của bạn được chuyển cho bạn từ một API như string(như vấn đề của tôi), bạn có thể sử dụng bộ lọc để chuyển đổi chuỗi thành một ngày trong giây lát. Điều này sẽ chăm sóc cảnh báo xây dựng thời điểm.

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

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

Thêm nó vào khung nhìn:

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

0

Như đã chỉ ra trong các câu trả lời trên. Cung cấp định dạng ngày sẽ hoạt động.

Tại sao tôi lại nhận được thông báo phản đối với dòng mã sau. Tôi nghĩ định dạng String + là giả sử để khắc phục vấn đề. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). Ngoài ra, xin vui lòng không tôi không có quyền kiểm soát định dạng ngày được cung cấp. Tôi biết tôi có thể tự chuyển đổi nó thành 'YYYY-MM-DDTHH:mm:ss'khoảnh khắc không hiển thị thông báo phản đối. Tuy nhiên, theo các tài liệu, dòng mã nên hoạt động. Đây là thông điệp phản đối tôi đang thấy.

"Cảnh báo khấu hao: giá trị được cung cấp không ở định dạng RFC2822 hoặc ISO được công nhận. Việc xây dựng thời điểm rơi trở lại js Date (), không đáng tin cậy trên tất cả các trình duyệt và phiên bản. Các định dạng ngày không RFC2822 / ISO không được khuyến khích và sẽ bị xóa trong một phát hành chính sắp tới. Vui lòng tham khảo http://momentjs.com/guides/#/warnings/js-date/ để biết thêm thông tin. "

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.