【问题标题】:Date comparison giving incorrect result日期比较给出不正确的结果
【发布时间】:2021-04-07 18:06:22
【问题描述】:

我从 API 响应中获取 DateTime,对于某些数据,我得到如下所示的虚拟日期:

0001-01-01T00:00:00

现在,我想检查如果我得到一个像上面这样的虚拟日期,那么我想将 null 存储在我的变量中,否则就是确切的日期。

我有一个类似下面的代码,但得到“NAN”:

console.log("2017-01-01T00:00:00" == "0001-01-01T00:00:00" ? null : moment("2017-01-01T00:00:00", "DD/MM/YYYY").year()); //output Nan

我不明白这里有什么问题。有人可以帮我吗?

【问题讨论】:

  • 它与asp.net或c#有什么关系?
  • 可以是moment("2017-01-01T00:00:00", "DD/MM/YYYY") 吗?显然输入不是那种格式。
  • @RomanMarusyk 实际上 API 是在 Asp.net MVC 中实现的,所以这就是为什么我认为我应该提到它
  • NAN 不是数字。当日期为空时,您通常会得到默认值,即 1/1/01,就像您的回复一样。
  • @jdweng 从服务器端是的,我相信这是正在发生的事情,但是在 javascript 中为什么这个比较失败了?有什么想法吗?

标签: javascript c# asp.net-mvc


【解决方案1】:

如果您尝试这样,将实际格式传递给 moment 函数,它会在您的情况下输出 2017。

console.log("2017-01-01T00:00:00" == "0001-01-01T00:00:00" ? null : moment("2017-01-01T00:00:00", "YYYY-MM-DDT h:mm:ss").year()); //outputs 2017

如果你想比较日期而不考虑日期时间格式,你可以这样做:

console.log(moment('2017-01-01T00:00:00').format('YYYY-MM-DD')); //date1
console.log(moment('2017-01-01T00:00:00').format('YYYY-MM-DD')); //date2

您现在可以通过设置您想要的格式来比较这两个日期,而不考虑原始格式

还包括来自 cmets 的 isSame 版本:

moment('2010-10-20').isSame('2010-10-20'); // true

但如果您有特殊情况,您应该考虑阅读 moment.js 文档。

【讨论】:

  • 是否可以在不考虑日期时间格式的情况下比较日期?因为明天如果有人改变格式,那么这会产生不正确的结果吗?
  • 如果您指定格式,这就是 moment.js 的工作方式。
  • 无论格式如何,唯一比较它们的方法是使用时间数据类型。只要你在处理字符串,格式就很重要。数据交换依赖于可靠的数据表示。如果有人改变格式,他们就违反了既定的合同。
  • 或者,只是moment('2017-01-01T00:00:00').isSame(moment('2017-01-01T00:00:00'))...
  • 我建议(或者更确切地说是暗示)的是 Alexandru 在这个答案的第一个代码块中的内容。您必须向右滚动才能看到它,但它就在那里。接受答案。
猜你喜欢
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多