我需要在javascript中比较两个日期。
在我的代码中,我正在调用一个Web服务方法,该方法序列化并以JSON格式返回以下类的实例
public class MyPeriod
{
public int PeriodID { get; set; }
public DateTime BeginDate { get; set; }
public DateTime FirstDeadline { get; set; }
public DateTime SecondDeadline { get; set; }
public DateTime EndDate { get; set; }
}
这将产生一个像这样的JSON片段:
{
"d": {
"PeriodID":26,
"BeginDate":"\/Date(1321743660000)\/",
"FirstDeadline":"\/Date(1322002860000)\/",
"SecondDeadline":"\/Date(1322002860000)\/",
"EndDate":"\/Date(1322168400000)\/"
}
}
现在我需要将FirstDeadline
与SecondDeadline
进行比较,因此在我的javascript中我有一个像这样的片段
var date1 = eval(data.d.FirstDeadline.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
var date2 = eval(data.d.SecondDeadline.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
if (date1 === date2) {
...
}
不幸的是,即使日期具有相同的值,相等的比较也不起作用。 有什么帮助吗?
更新1
我忘了提到我只需要比较日期部分(这是我不比较自纪元以来的毫秒数)。
答案 0 :(得分:4)
你可以做到
if(date1.toDateString() === date2.toDateString()) {
答案 1 :(得分:3)
尝试比较它们的“时间”(自纪元以来的毫秒数)值:
if (date1.getTime() === date2.getTime()) {
// OK
}
<强> [编辑] 强>
如果你只关心日期而不关心时间,那么这样的事情就可以了:
function sameDate(d1, d2) {
return ((d1.getFullYear() === d2.getFullYear())
&& (d1.getMonth() === d2.getMonth())
&& (d1.getDate() === d2.getDate()));
}
if (sameDate(date1, date2)) {
// OK
}
答案 2 :(得分:2)
尝试使用getTime
对象的Date
方法进行日期比较。像这样的一些东西会比较时间滴答。
if (date1.getTime() == date2.getTime()) {
}
回答您编辑过的问题
if(date1.getMonth() == date1.getMonth() &&
date1.getDate() == date2.getDate() &&
date1.getFullYear() == date2.getFullYear()){
}
答案 3 :(得分:2)
首先,你的比较如果失败,因为===运算符寻找绝对相等。但是您构建了两个不同的日期对象。比较日期对象与比较原始值(例如数字)不同。因此,即使日期代表相同的值,===也总会失败。
var a = new Date(100000);
var b = new Date(100000);
console.log(a === b); // false
console.log(a.getTime() === b.getTime()); // true
var a = new Date(100000);
var a = b;
console.log(a === b); // true
其次,如果您正在抓取该值的数字部分(纪元值,以毫秒为单位),您实际上不需要创建新的Date对象来比较它们。为什么不直接比较数字?
编辑:根据您的编辑,如果您只是想比较“日期”部分:
if(date1.getDay() === date2.getDay() && date1.getMonth() === date2.getMonth() && date1.getFullYear() === date2.getFullYear()){
}
答案 4 :(得分:0)
首先,当你有'Date(1322002860000)'时,数字部分是自纪元以来的毫秒数。
你要做的是:
var myDate = new Date();
myDate.setTime(1322002860000);
您还可以使用更高级的纪元转换器,就像他们在那里做的那样:http://www.esqsoft.com/javascript_examples/date-to-epoch.htm
希望这有帮助!
答案 5 :(得分:0)
你应该将它们转换为javascript Date对象,如:
var d = new Date();
d.setTime(1321743660000);
那么你可以比较。有关详细信息,请参阅http://www.w3schools.com/jsref/jsref_obj_date.asp
答案 6 :(得分:0)
您可以使用JSON.parse
代替eval
,并使用reviver构建日期,如下所述:How to use JSON.parse reviver parameter to parse date string
如果您知道JSON来自可靠来源,则可以更改
.replace(/\/Date\((\d+)\)\//gi, "new Date($1)")
到
.replace(/\/Date\((\d+)\)\//gi,
function (_, n) { return new Date(+n); })
使用替换函数替换器来构造一个新的日期对象,其millis-since-epoch是组1中的数值。