在javascript/jquery中比较两种日期格式

25

我有以下内容:

var fit_start_time  = $("#fit_start_time").val(); //2013-09-5
var fit_end_time    = $("#fit_end_time").val(); //2013-09-10

if(Date.parse(fit_start_time)>=Date.parse(fit_end_time)){
    alert("Please select a different End Date.");
}

以上代码不起作用。是否有其他解决方案?

按照在哪里可以找到关于JavaScript日期格式的文档?的方式进行日期格式化也对我无效。

8个回答

68

很简单:

if(new Date(fit_start_time) <= new Date(fit_end_time))
{//compare end <=, not >=
    //your code here
}

比较两个 Date 实例完全没有问题。它会自动调用valueOf,将 Date 实例强制转换为整数,这些整数可以使用所有比较运算符进行比较。嗯,要100%准确:由于JS不知道整数或浮点数,它们都是带符号的64位IEEE 754双精度浮点数,因此Date实例将被强制转换为Number类型。


实际上,相同的日期验证失败了。您需要将其分开处理才能实现此目的。http://jsfiddle.net/neBHQ/3/ - Roy M J
1
@RoyMJ:你的小提琴有缺陷:你永远不会发出警报1,因为日期既不能是 < 也不能是 ==。而且,== 不会强制将对象转换为整数,因此你正在比较两个不同的对象,因此始终为false(尝试 new Date('2013-09-1') == new Date('2013-09-1') 始终为false)。你的小提琴应该是这个 - Elias Van Ootegem
1
@RoyMJ,我正要写Elias Van Ootegem所写的内容。你没有在jsFiddle中复制他的代码,而是在你的条件中添加了一个&&子句,使它必须相等且更少。这在很多方面都是愚蠢的。 - shennan
@EliasVanOotegem 当使用不同的月份时,它无法工作。 如果我使用11月的fit_start_time日期和12月的fit_end_time日期,则无法验证。 请帮忙。 - techV
仅在同一个月的日期工作。 - Sandeep Shekhawat

6

比较字符串格式(mm-dd-yyyy)的日期。

    var job_start_date = "10-1-2014"; // Oct 1, 2014
    var job_end_date = "11-1-2014"; // Nov 1, 2014
    job_start_date = job_start_date.split('-');
    job_end_date = job_end_date.split('-');

    var new_start_date = new Date(job_start_date[2],job_start_date[0],job_start_date[1]);
    var new_end_date = new Date(job_end_date[2],job_end_date[0],job_end_date[1]);

    if(new_end_date <= new_start_date) {
      // your code
    }

1
JavaScript不是从0索引开始计算月份吗?你的Date对象的月份部分应该减去-1,如果我错了请纠正我。 - sgauri
月份索引从0开始,因此console.log(new Date('2014','09','1'))将显示2014年10月1日。上述解决方案对我有效,但我必须将(month-1)传递给月份参数。如果月份值大于11,则会出现意外日期。 - karunakar bhogyari

3

就像你的例子一样,fit_start_time不能晚于fit_end_time

尝试反过来:

var fit_start_time  = $("#fit_start_time").val(); //2013-09-5
var fit_end_time    = $("#fit_end_time").val(); //2013-09-10

if(Date.parse(fit_start_time) <= Date.parse(fit_end_time)){
    alert("Please select a different End Date.");
}

更新

你的代码意味着你想要看到使用当前变量的 alert。如果是这样的话,上述代码是正确的。如果你的意图(根据message提示)是确保他们的 fit_start_time 变量是一个在 fit_end_time 之前的日期,那么你原来的代码是没问题的,但是你从 jQuery 的 .val() 方法获取到的数据没有解析正确。如果你提供选择器所定位的实际 HTML 代码,我们会更好地帮助你。


@RoyMJ 这取决于你对“正常工作”的定义。它是可以运行的,只是没有给你期望的行为。 - shennan

2

尝试使用 new Date(obj).getTime()

if( new Date(fit_start_time).getTime() > new Date(fit_end_time).getTime() )
{
    alert(fit_start_time + " is greater."); // your code
}
else if( new Date(fit_start_time).getTime() < new Date(fit_end_time).getTime() )
{
    alert(fit_end_time + " is greater."); // your code
}
else
{
    alert("both are same!"); // your code
}

实际上,如果您将>=比较分为两个步骤,则可以使其正常工作。很奇怪。 - Roy M J
这段代码一遍又一遍地创建相同的 Date 实例,请不要...只需将它们分配给 fit_start_timefit_end_time,以避免无意义的开销。 - Elias Van Ootegem

0

这已经是:

使用JQuery从出生日期计算年龄

或者你也可以使用Date.parse(),如下所示:

var date1 = new Date("10/25/2011");
var date2 = new Date("09/03/2010");
var date3 = new Date(Date.parse(date1) - Date.parse(date2));

0

尝试另一种方式:

var start_date  = $("#fit_start_time").val(); //05-09-2013
var end_date    = $("#fit_end_time").val(); //10-09-2013
var format='dd-MM-y';
    var result= compareDates(start_date,format,end_date,format);
    if(result==1)/// end date is less than start date
    {
            alert('End date should be greater than Start date');
    }



OR:
if(new Date(start_date) >= new Date(end_date))
{
    alert('End date should be greater than Start date');
}

我觉得你漏掉了compareDates函数,如果你上面的代码要正常工作的话。 - Roy M J

0
let Date1 = "04-18-2023" // 18 April, 2023 
let Date2 = "05-01-2023" // 01 May, 2023 
if(new Date(Date1) < new Date(Date2)) 
{ 
 console.log("Date1 is less than Date2")
}

-1

var startDate= "2014年11月11日"; // 2021年11月10日

var endDate= "2014年11月1日";

startDate= startDate.split('-');

endDate= endDate.split('-');

var newStartDate= new Date(startDate[2],startDate[0]-1,startDate[1]);

var newEndDate= new Date(endDate[2],endDate[0]-1,endDate[1]);

if(newEndDate<= newStartDate) {

}


这更像是对此答案及其评论的回应,而不是一个新的答案... - Eric Aya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接