【问题标题】:Comparing two dates with time correctly正确比较两个日期和时间
【发布时间】:2016-04-08 05:11:02
【问题描述】:

我的目标是比较开始和结束日期时间的日期加时间。

以下仅处理日期的代码不起作用

var startDate = "22-Apr-2016";
var endDate = "22-Apr-2016";
var stdate = new Date(startDate);
var endate = new Date(endDate);
var startTime = "10:14 AM";
var endTime = "11:14 PM";
var stTime = startTime.substring(0, 5);
var enTime = endTime.substring(0, 5);
var stAMorPM = startTime.substring(6, 8);
var enAMorPM = endTime.substring(6, 8);

if( (stdate > endate)) {
    console.log("first date is greater");
}

if((stdate == endate)) {
    console.log("Equal dates");
}

更新:

通过连接来比较开始和结束日期时间的日期和时间,这可能不是正确的方法。

var start = "22-Apr-2016"+ " "+startTime;
var end   = "22-Apr-2016"+ " "+endTime;
start     = new Date(start);
end       = new Date(end);
if(start.getTime() > end.getTime()){
  console.log("start greater ")
} else if(start.getTime() < end.getTime()) {
  console.log("start lesser ")
} else if(start.getTime() == end.getTime()) {
  console.log("start equals ")
}

【问题讨论】:

  • @mplungjan 我会将日期和时间作为单独的字段获取。不在一个领域。如果您有示例示例,您可以提供
  • 如果浏览器可以处理 new Date("DD-MMM-YYYY") 则只有一个副本,这只是一个开始,因为他需要将 10:14 AM 附加到它
  • @syed — 您可以使用类似here 的函数,注意它会转换为 UTC-0500,但您应该能够解决。如果您在迄今为止的转换方面需要帮助,请发布另一个问题。

标签: javascript


【解决方案1】:

比较日期是解决此问题的好方法,您的问题是如何将字符串转换为日期。您不应使用 Date 构造函数(或 Date.parse)来解析字符串,因为它在很大程度上取决于实现,甚至与 ECMA-262 一致的字符串也不一定能正确解析或给出预期结果。

因此,首要任务是解析日期字符串。您可以使用库,但如果您只有一种格式来支持简单功能就足够了。如果日期和时间作为单独的部分提供,则解析每个部分相当简单,可以作为单独的函数或全部合二为一,例如

/*  @param {string} s - date string in format dd-MMM-yyyy
**  @returns {Date} Date assuming local date
*/
function parseDate(s) {
  var months = {jan:0,feb:1,mar:2,apr:3,may:4,jun:5,
                jul:6,aug:7,sep:8,oct:9,nov:10,dec:11};
  var b = s.match(/\w+/g) || [];
  return new Date(b[2], months[b[1].slice(0,3).toLowerCase()], b[0]);
}

/*  @param {string} s - time string in format hh:mmap
**  @returns {Number} time converted to milliseconds
*/
function parseTimeToMs(s) {
  var b = s.split(/\D/);
  var h = b[0]%12 + (/pm$/i.test(s)? 12 : 0);
  return h*3.6e6 + b[1]*6e4;
}

/*  @param {string} ds - date string in format dd-MMM-yyyy
/*  @param {string} ts - time string in format hh:mmap
**  @returns {Date} Date assuming local date built from date and time strings
*/
function getDate(ds, ts) {
  var d = parseDate(ds);
  d.setMilliseconds(d.getMilliseconds() + parseTimeToMs(ts));
  return d;
}

var startDate = '22-Apr-2016';
var endDate   = '22-Apr-2016';
var startTime = '10:14 AM';
var endTime   = '11:14 PM';

document.write('Start is: ' + getDate(startDate, startTime));
document.write('<br>End is : ' + getDate(endDate, endTime));
document.write('<br>Start before end? ' + (getDate(startDate, startTime) < getDate(endDate, endTime)));
body {
  font-family: courier, monospace;
  font-size: 80%;
}

请注意,如果使用关系运算符&lt;&gt;,操作数将被强制为数字,但是如果使用===== 进行相等比较,当它们比较操作数时,您总是会得到假作为对象,它们永远只与它们自己相等。

因此,您可能希望始终明确地将日期转换为数字,以确保一元 + 运算符很方便:

+getDate(startDate, startTime) < +getDate(endDate, endTime)

+getDate(startDate, startTime) == +getDate(endDate, endTime)

【讨论】:

    【解决方案2】:

    您不必做所有这些。只需以毫秒为单位获取时间并进行比较。所以它会是这样的:

    if (stdate.getTime() > endate.getTime()) {
         console.log("first date is greater");
    }
    
    if (stdate.getTime() == endate.getTime()) {
         console.log("Equal dates");
    }
    

    【讨论】:

      【解决方案3】:

      两个 JavaScript 对象,在你的例子中是 Date 实例,只有当它们引用同一个对象时才能被认为是相等的。因此,两个对象,即使日期相同,在使用== 进行比较时,总是会给出false

      如果要比较两个日期,则必须比较它们的时间戳。您可以使用.getTime() 方法获取它们:

      if (stdate.getTime() == endate.getTime()) {
        console.log("Equal dates");
      }
      

      【讨论】:

      • 在这个例子中他的时间在哪里?
      • @mplungjan 这是一个正确的答案。 getTime 返回自 1970 年 1 月 1 日以来的毫秒数。
      • 在这个例子中他的上午 10:14 在哪里?
      • @mplungjan 问题是他们只想了解“第一步”。这段代码也适用于此。
      • 对。他的下一个问题将是附上时间。还有新日期(“DD-MMM-YYYY)与浏览器的兼容性如何?现在是更新的问题
      【解决方案4】:

      试试这个

      var startDate = "22-Apr-2016";
      var endDate = "22-Apr-2016";
      var stdate = new Date(startDate);
      var endate = new Date(endDate);
      if( (stdate.toUTCString() > endate.toUTCString())) {
          alert("first date is greater");
      }
      
      
      if(stdate.toUTCString() == endate.toUTCString()) {
          alert("Equal dates");
      }
      

      【讨论】:

        【解决方案5】:
        if( (new Date(startDate).getDate() > new Date(endDate).getDate())){
            // to do
        }
        

        希望这对你有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多