正确比较两个日期与时间

时间:2016-04-08 05:11:03

标签: javascript

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

以下仅处理日期的代码无效

True

更新:

通过连接来比较开始和结束日期时间的日期和时间是不正确的。

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");
}

5 个答案:

答案 0 :(得分:1)

你不必完成所有这些。只需以毫秒为单位获取时间并进行比较。所以就是这样:

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

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

答案 1 :(得分:1)

在您的Date实例中,只有两个JavaScript对象引用同一个对象时才能被视为相等。因此,使用false进行比较时,即使具有相同日期的两个对象也始终会==

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

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

答案 2 :(得分: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%;
}

请注意,如果使用关系运算符<>,操作数将被强制转换为数字,但是如果与=====进行相等比较,则会总是得到假,因为他们将操作数比作对象,它们只与自己相等。

因此,您可能希望始终将日期显式转换为数字以确保,一元+运算符对此非常方便:

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

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

答案 3 :(得分:-1)

试试这个

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");
}

答案 4 :(得分:-2)

if( (new Date(startDate).getDate() > new Date(endDate).getDate())){
    // to do
}

希望这适合你。