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)\/"
    

现在我需要将FirstDeadlineSecondDeadline 进行比较,所以在我的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日期时间比较

仅比较日期部分而不比较 JavaScript 中的时间

如何比较日期和时间并获取差异,然后在 Javascript 中将其设置为秒

通过与javascript中的今天日期进行比较来允许今天的日期和未来的日期

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

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