Moment.js 中的弃用警告 - 不是公认的 ISO 格式

IT技术 javascript jquery momentjs
2021-01-24 13:07:53

我收到一条警告,指出提供给 moment 的值不是公认的 ISO 格式。我今天用 moment 函数更改了我的变量,但它仍然不起作用。

这是警告错误:

弃用警告:提供的值不是公认的 ISO 格式。moment 构造回退到 js Date(),它在所有浏览器和版本中都不可靠。不鼓励非 ISO 日期格式,并将在即将发布的主要版本中删除。请参阅http://momentjs.com/guides/#/warnings/js-date/了解更多信息。参数: [0] _isAMomentObject: true, _isUTC: true, _useUTC: true, _l: undefined, _i: 2016-9-26 19:30, _f: undefined, _strict: undefined, _locale: [object Object]

var entryDate = new Date();
var currentDate = entryDate.getDate();

function between(x, min, max) {
  return x.valueOf() >= min.valueOf() && x < max.valueOf();
}

$('#custom1').change(function () {
  if ($('#custom1 :selected').val() == 'AU') {
    var keyword = '';

    var aus1_s = moment.tz('2016-9-26 19:30', 'Australia/Sydney');
    var aus2_s = moment.tz('2016-10-2 19:30', 'Australia/Sydney');
    var aus3_s = moment.tz('2016-10-9 19:30', 'Australia/Sydney');
    var aus4_s = moment.tz('2016-10-16 19:30', 'Australia/Sydney');
    var aus5_s = moment.tz('2016-10-23 19:30', 'Australia/Sydney');
    var aus6_s = moment.tz('2016-10-30 19:30', 'Australia/Sydney');
    var aus6_e = moment.tz('2016-11-5 19:30', 'Australia/Sydney');
  } else if ($('#custom1 :selected').val() == 'NZ') {
    var aus1_s = moment.tz('2016-9-28 20:30', 'Pacific/Auckland');
    var aus2_s = moment.tz('2016-10-4 20:30', 'Pacific/Auckland');
    var aus3_s = moment.tz('2016-10-11 20:30', 'Pacific/Auckland');
    var aus4_s = moment.tz('2016-10-18 20:30', 'Pacific/Auckland');
    var aus5_s = moment.tz('2016-10-25 20:30', 'Pacific/Auckland');
    var aus6_s = moment.tz('2016-11-2 20:30', 'Pacific/Auckland');
    var aus6_e = moment.tz('2016-11-9 20:30', 'Pacific/Auckland');
  } else {
    $('#entryEquals').val('');
    return false;
  }

  var today = moment();

  switch (true) {
    case between(today, aus1_s, aus2_s):
      keyword = 'RElYT04=';
      break;

    case between(today, aus2_s, aus3_s):
      keyword = 'QlJJREU=';
      break;

    case between(today, aus3_s, aus4_s):
      keyword = 'U1lETkVZ';
      break;

    case between(today, aus4_s, aus5_s):
      keyword = 'R1JPT00=';
      break;

    case between(today, aus5_s, aus6_s):
      keyword = 'V0VERElORw==';
      break;

    case between(today, aus6_s, aus6_e):
      keyword = 'VExD';
      break;

    default:
      $('#entryEquals').val('');
      break;
  }

  $('#entryEquals').val(keyword);
});
6个回答

查看他们所有很棒的文档!

这是他们讨论警告消息的地方

字符串 + 格式

警告:浏览器对解析字符串的支持不一致。因为没有关于应该支持哪些格式的规范,所以在某些浏览器中有效的方法在其他浏览器中无效。

对于解析 ISO 8601 字符串以外的任何内容的一致结果,您应该使用String + Format

moment("12-25-1995", "MM-DD-YYYY");

字符串 + 格式(多种格式)

如果您有多种格式,请查看它们的String + Formats(带有“s”)。

如果您不知道输入字符串的确切格式,但知道它可能是多种格式之一,则可以使用格式数组。

moment("12-25-1995", ["MM-DD-YYYY", "YYYY-MM-DD"]);

请查看文档以了解更具体的内容。

时区

Checkout Parsing in Zone,时区的等效文档。

moment.tz 构造函数采用与 moment 构造函数相同的所有参数,但使用最后一个参数作为时区标识符。

var b = moment.tz("May 12th 2014 8PM", "MMM Do YYYY hA", "America/Toronto");

编辑

//...
var dateFormat = "YYYY-M-D H:m"; //<-------- This part will get rid of the warning.
var aus1_s, aus2_s, aus3_s, aus4_s, aus5_s, aus6_s, aus6_e;
if ($("#custom1 :selected").val() == "AU" ) {
    var region = 'Australia/Sydney';

    aus1_s = moment.tz('2016-9-26 19:30', dateFormat, region);              
    aus2_s = moment.tz('2016-10-2 19:30', dateFormat, region);              
    aus3_s = moment.tz('2016-10-9 19:30', dateFormat, region);                  
    aus4_s = moment.tz('2016-10-16 19:30', dateFormat, region);                 
    aus5_s = moment.tz('2016-10-23 19:30', dateFormat, region);
    aus6_s = moment.tz('2016-10-30 19:30', dateFormat, region);
    aus6_e = moment.tz('2016-11-5 19:30', dateFormat, region);
} else if ($("#custom1 :selected").val() == "NZ" ) {
    var region = 'Pacific/Auckland';

    aus1_s =  moment.tz('2016-9-28 20:30', dateFormat, region);
    aus2_s =  moment.tz('2016-10-4 20:30', dateFormat, region);
    aus3_s =  moment.tz('2016-10-11 20:30', dateFormat, region);
    aus4_s =  moment.tz('2016-10-18 20:30', dateFormat, region);
    aus5_s =  moment.tz('2016-10-25 20:30', dateFormat, region);
    aus6_s =  moment.tz('2016-11-2 20:30', dateFormat, region);
    aus6_e =  moment.tz('2016-11-9 20:30', dateFormat, region);
}
//...
请提供实际答案,而不是复制和粘贴文档。
2021-03-19 13:07:53
@Rebs 我想我添加了很多文档,因为一般的解决方案并不简单。显然,Jemai 的具体解决方案应该在答案中,并且我已经添加了它(感谢您!)但前者是这里有这么多文档的原因。
2021-03-19 13:07:53
这对我有帮助 --> moment("12-25-1995", ["MM-DD-YYYY", "YYYY-MM-DD"]);
2021-03-27 13:07:53
这就是帮助我将格式设置为“输入”的原因 - moment("12-25-1995", ["MM-DD-YYYY", "YYYY-MM-DD"]);
2021-04-01 13:07:53
谢谢,但是如果您只想要一个没有这种繁重格式框架的简单日期,我们可以忽略此警告吗?
2021-04-08 13:07:53

这样做对我有用:

moment(new Date("27/04/2016")).format
你说“IE 11”,好吧,我听不见。
2021-03-16 13:07:53
这是最简单、最准确的答案。谢谢它帮助了我。
2021-03-26 13:07:53
对于必须在任何程度上处理 IE 支持的任何人,我都不会建议这种方法。结果非常不稳定,特别是在 IE 11 上。
2021-04-05 13:07:53
对我很有用。我还可以在最后传递日期格式: return moment(new Date(value)).format(dateFormat);
2021-04-07 13:07:53
这是避免控制台污染的最简单的解决方法
2021-04-11 13:07:53

像这样在你的函数中使用 moment

 moment(new Date(date)).format('MM/DD/YYYY')
如果您只想摆脱“折旧警告”,这就是您正在寻找的简短答案
2021-03-30 13:07:53
你能定义这个答案中的日期吗?
2021-04-06 13:07:53

我遇到了这个错误,因为我试图从localStorage. 将日期传递给一个新Date对象,然后调用.toISOString()对我有用

const dateFromStorage = localStorage.getItem('someDate');
const date = new Date(dateFromStorage);
const momentDate = moment(date.toISOString());

这抑制了控制台中的任何警告。

这将抑制警告,但缺点是如果您特定于时区,那么我不会建议这样做:因为它会将给定的日期转换为 UTC,正如我们所说的 '.toISOString()' 。尝试“moment(new Date("27/04/2016")).format”,如其他答案所述 - 这将使时间保持在本地..
2021-03-14 13:07:53

这个答案是为了更好地理解这个警告

使用 moment 创建时间对象时会导致弃用警告,var today = moment();.

如果这个警告对你没问题,那么我有一个更简单的方法。

不要使用dateobject from jsusemoment来代替。例如用于moment()获取当前日期。

或者将js日期对象转换moment日期。您可以简单地指定js日期对象的格式

IE, moment("js date", "js date format");

例如:

moment("2014 04 25", "YYYY MM DD");

(但您只能使用这种方法直到它被贬值,这可能会moment在未来贬值

严重地!关于如何删除此弃用警告的问题!不问如何使用这个弃用!此外,它是“这将在未来被移除”而不是“这可能会从未来的那一刻开始贬值”它已经被贬低了!
2021-03-15 13:07:53
@Al-Mothafar,我有一个小疑问,你为什么在if条件失败时超越您应该退出答案而不是继续。
2021-03-24 13:07:53
谢谢,这是真正向我展示了我可以在这里了解的答案。
2021-04-04 13:07:53