如何在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" > "2017/10/7"
给false
:D
@CaseyC 这与语法无关。这是关于“7”之前缺少前导零的问题。如果你正好通过2017/10/26
和2017/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中比较两个字符串日期?的主要内容,如果未能解决你的问题,请参考以下文章