javascript日期时间比较
Posted
技术标签:
【中文标题】javascript日期时间比较【英文标题】:javascript Datetime compare 【发布时间】:2012-01-04 22:33:47 【问题描述】:我需要在 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
我忘了提到我只需要比较日期部分(这样我就不会比较自纪元以来的毫秒数)。
【问题讨论】:
我不知道为什么这不起作用,但您可以将日期转换为字符串(.toString、.toGMTString、.toUTCString、.toISOString)并将其用于比较。似乎工作。 另见:***.com/questions/7244513/… 【参考方案1】:你可以的
if(date1.toDateString() === date2.toDateString())
【讨论】:
感谢您的回答。你能看看我的编辑吗?我忘了提一个小细节:)【参考方案2】:首先,当您有一个“日期(1322002860000)”时,数字部分是自纪元以来的毫秒数。
你要做的是:
var myDate = new Date();
myDate.setTime(1322002860000);
您还可以使用更高级的纪元转换器,就像他们在那边做的那样:http://www.esqsoft.com/javascript_examples/date-to-epoch.htm
希望这会有所帮助!
【讨论】:
感谢您指出这一点。无论如何,我在转换日期时没有任何问题。只是比较部分的问题...... 感谢您的回答。你能看看我的编辑吗?我忘了提一个小细节:)【参考方案3】:您应该将它们转换为 javascript Date 对象,例如:
var d = new Date();
d.setTime(1321743660000);
然后你可以比较。更多信息请见http://www.w3schools.com/jsref/jsref_obj_date.asp
【讨论】:
感谢您的回答。你能看看我的编辑吗?我忘了提一个小细节:)【参考方案4】:尝试比较它们的“时间”(自纪元以来的毫秒数)值:
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
【讨论】:
使用三等号是矫枉过正的家伙 ;-) 但这是正确的解决方案! 感谢您的回答。你能看看我的编辑吗?我忘了提一个小细节:) @DominicGoulet:也许吧,但它已成为 JS 社区的最佳实践,在这种情况下不会造成任何伤害,所以我会坚持下去 =)【参考方案5】:您可以使用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); )
它使用替换函数来构造一个新的日期对象,其毫秒自纪元是来自组 1 的数值。
【讨论】:
感谢您的回答。你能看看我的编辑吗?我忘了提一个小细节:)【参考方案6】:尝试使用Date
对象的getTime
方法进行日期比较。类似这样的东西会比较时间滴答。
if (date1.getTime() == date2.getTime())
回答您编辑的问题
if(date1.getMonth() == date1.getMonth() &&
date1.getDate() == date2.getDate() &&
date1.getFullYear() == date2.getFullYear())
【讨论】:
感谢您的回答。你能看看我的编辑吗?我忘了提一个小细节:)【参考方案7】:首先,如果您的比较失败,因为 === 运算符寻找绝对相等。但是你正在构建两个不同的日期对象。比较日期对象与比较原始值(例如数字)不同。所以,=== 总是会失败,即使日期代表相同的值。
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())
【讨论】:
感谢您的回答。你能看看我的编辑吗?我忘了提一个小细节:)以上是关于javascript日期时间比较的主要内容,如果未能解决你的问题,请参考以下文章
如何比较日期和时间并获取差异,然后在 Javascript 中将其设置为秒