如何在javascript中比较两个字符串日期?

Posted

技术标签:

【中文标题】如何在javascript中比较两个字符串日期?【英文标题】:how to compare two string dates in javascript? 【发布时间】:2013-01-24 17:24:48 【问题描述】:

我有两个格式为 m/d/yyyy 的字符串日期。例如,“2012 年 11 月 1 日”、“2013 年 1 月 2 日”。我正在用 javascript 编写一个函数来比较两个字符串日期。我的函数的签名是 bool isLater(string1, string2),如果string1传递的日期晚于string2传递的日期,则返回true,否则返回false。 因此,isLater(“1/2/2013”​​, “11/1/2012”) 应该返回 true。如何为此编写 JavaScript 函数?

【问题讨论】:

从您的字符串中创建两个 Date 对象并将它们作为数字进行比较。 将字符串转换为原生 JS 日期时间对象(参见 ***.com/questions/5619202/…)。从那里开始变得容易。 如何从字符串中创建两个日期对象? 【参考方案1】:

解析日期并像比较数字一样比较它们:

function isLater(str1, str2)

    return new Date(str1) > new Date(str2);

如果您需要支持其他日期格式,请考虑使用 date.js 等库。

【讨论】:

我想指出,这仅适用于比较运算符,不适用于相等 ==!= 它不适用于格式 DD/MM/yyyy 为什么有人可以告诉我?? @meenu1meen JavaScript 规范中只有几种可解析的数据格式。浏览器也支持其他一些,尽管它们不在规范中(例如大多数解析 mm-dd-yyyy)。但没有任何保证,您需要在自己的代码中或使用库显式解析它。【参考方案2】:
var d1 = Date.parse("2012-11-01");
var d2 = Date.parse("2012-11-04");
if (d1 < d2) 
    alert ("Error!");

Demo Jsfiddle

最近从评论中发现可以直接比较如下字符串

if ("2012-11-01" < "2012-11-04") 
    alert ("Error!");

【讨论】:

如果日期的格式是 1992 年 12 月 31 日,它会起作用吗? MM/dd/YYYY 在哪里? 它也适用于 MM/dd/YYYY 格式。 @AnttiHaapala 它似乎适用于所有操作员。 我撤回了我的评论,我声称这不适用于==,因为当我瞥见代码时,我认为它是在比较 Date 对象。但是,Date.parse 会返回一个整数(现在这有多方便),并且此代码也适用于相等性。不过,请注意 new Date('2015-10-10') == new Date('2015-10-10') 是错误的! 它不适用于格式 DD/MM/yyyy 为什么有人可以告诉我?? 如果您可以发布您的代码,那么我们将能够为您提供帮助。请确保您没有为 Date.parse 使用新关键字。 Date.parse 只是一种方法。【参考方案3】:

你可以简单地比较两个字符串

function isLater(dateString1, dateString2) 
  return dateString1 > dateString2

然后

isLater("2012-12-01", "2012-11-01")

返回真

isLater("2012-12-01", "2013-11-01")

返回假

【讨论】:

"2017/10/26" &gt; "2017/10/7"false :D @CaseyC 这与语法无关。这是关于“7”之前缺少前导零的问题。如果你正好通过2017/10/262017/10/7,你会得到false。重要的是,格式应该非常具体,这样解决方案才能正常工作。 @max 是对的。不是语法,它是特定于格式的。我删除了我的评论,因为它具有误导性。 这是怎么回事?? parseInt('2012-12-01') 只是 2012 年。我不明白幕后发生了什么,也不明白为什么会这样 尽管此处的 cmets 存在一些混淆,但这确实适用于所有 YYYY-MM-DD 日期。最初的问题是询问“m/d/yyyy”日期,但我们大多数人在内部使用 YYYY-MM-DD,所以这是大多数情况下的最佳解决方案。【参考方案4】:

如果您的日期不是标准格式 yyyy-mm-dd (2017-02-06),例如 20/06/2016。您可以使用此代码

var parts ='01/07/2016'.val().split('/');
var d1 = Number(parts[2] + parts[1] + parts[0]);
parts ='20/06/2016'.val().split('/');
var d2 = Number(parts[2] + parts[1] + parts[0]);
return d1 > d2

【讨论】:

这不起作用。它以同等重要性对待日期的所有部分。你想要类似 var d1 = Number(parts[2] * 10000 + parts[1] * 100 + parts[0]);【参考方案5】:

直接解析不是 yyyy-mm-dd 格式的日期字符串,例如 accepted answer 不起作用。 vitran 的答案确实有效,但混合了一些 JQuery,所以我对其进行了一些修改。

// Takes two strings as input, format is dd/mm/yyyy
// returns true if d1 is smaller than or equal to d2

function compareDates(d1, d2)
var parts =d1.split('/');
var d1 = Number(parts[2] + parts[1] + parts[0]);
parts = d2.split('/');
var d2 = Number(parts[2] + parts[1] + parts[0]);
return d1 <= d2;

附:会直接评论 vitran 的帖子,但我没有代表这样做。

【讨论】:

谢谢。这甚至适用于自定义日期格式。 这个很好用,我们只需要在个位数月份和个位数日期之前补零 这根本行不通。据此,1-1-2019 小于 31-12-1985,这显然是错误的。 那是因为我相信你没有正确格式化日期。应该是 dd/mm/yyyy 是 dd/mm/yyyy。您可以自己查看:01/01/2019(2019 年 1 月 1 日)和 31/12/1985(1985 年 12 月 31 日)。如果您连接每个日期的部分,然后将它们转换为一个数字,您将得到 1,012,019 和 31,121,985。第二个数字显然比第一个大……但事实是第一个日期比第二个大 30 年。即使将其各部分的总和也视为数字,它也行不通(2021 【参考方案6】:

您可以使用“Date.parse()”正确比较日期,但由于在大多数 cmets 中,人们试图拆分字符串,然后尝试将数字相加并与明显错误的逻辑进行比较 - 不完全.

这就是诀窍。如果您要破坏字符串,则以嵌套格式比较各个部分。

比较年与年,月与月,日与日。

<pre><code>

var parts1 = "26/07/2020".split('/');
var parts2 = "26/07/2020".split('/');

var latest = false;

if (parseInt(parts1[2]) > parseInt(parts2[2])) 
    latest = true;
 else if (parseInt(parts1[2]) == parseInt(parts2[2])) 
    if (parseInt(parts1[1]) > parseInt(parts2[1])) 
        latest = true;
     else if (parseInt(parts1[1]) == parseInt(parts2[1])) 
        if (parseInt(parts1[0]) >= parseInt(parts2[0])) 
            latest = true;
         
    


return latest;

</code></pre>

【讨论】:

以上是关于如何在javascript中比较两个字符串日期?的主要内容,如果未能解决你的问题,请参考以下文章

javascript中如何比较字符串形式的时间格式的时间差

请问C++中两个字符串的大小是怎样比较的?

将两个日期与从 HTML5 数据中提取的 javascript 进行比较

在Javascript中比较两个相同的日期[重复]

JS 如何比较时间大小?

JavaScript比较俩日期字符串大小