【问题标题】:Advice on how to compare a date input value against min/max date ranges有关如何将日期输入值与最小/最大日期范围进行比较的建议
【发布时间】:2013-12-14 19:46:28
【问题描述】:

我设置了一个 jQuery 日期选择器,它接受出生日期,并希望使用选择的日期来输出特定类别,将输入的日期与每个类别的最小和最大日期进行比较。目前我在比较日期时遇到问题,希望能得到一些建议。我现在知道我的问题是因为我正在尝试比较一个字符串和一个字符串,但我想知道我应该将每个日期转换为类似 unix 值的东西来进行比较还是有一些Date()我应该在我的每个 ageLimits

上使用

JS

var ageLimits = {
    'under10': {
        'minAge': '06-05-2005',
        'maxAge': '07-04-2004'
    },
    'under13': {
        'minAge': '08-04-2003',
        'maxAge': '15-08-2001'
    },
    'under15': {
        'minAge': '16-08-2000',
        'maxAge': '07-12-1999'
    }
}
function getUserDate(val) {

    dateInput = moment( $('#datepicker').val(), 'MM-DD-YYYY');   

    //pass full date to selectAgeCategory
    selectAgeCategory( dateInput.format('MM-DD-YYYY') );

}

function selectAgeCategory(date) {
      console.log(date);

    if( date >= ageLimits.under10.minAge && date <= ageLimits.under10.maxAge ) {
        console.log('Under 10 category');
    } else if ( date >= ageLimits.under13.minAge && date <= ageLimits.under13.maxAge ) {
        console.log('Under 13 category');
    } else if ( date >= ageLimits.under15.minAge && date <= ageLimits.under15.maxAge ) {
        console.log('Under 15 category');
    } else {
        console.log('No category available for this age');
    }    
}

JSFiddle:http://jsfiddle.net/qA9NT/5/

【问题讨论】:

  • 停止以字符串形式存储和比较日期
  • 嘿@ryan 是的,我意识到这就是问题所在,但我现在应该怎么做才能解决这个问题?

标签: javascript jquery date


【解决方案1】:

我看到你已经在使用moment

您可以使用moment 解析日期字符串,并使用toDate 从时刻实例中获取本机日期对象。然后你可以自然地比较原生的Date对象。

本机 Date 构造函数已经可以解析某些格式,因此您甚至可能不需要使用 moment 进行解析。

请注意,如果您对 ageLimits 对象进行硬编码,您可以立即构造日期对象,而不是存储字符串。

var date1 = moment("12-25-1995", "MM-DD-YYYY").toDate(),
    date2 = moment("12-25-1996", "MM-DD-YYYY").toDate();

if (date1 < date2) console.log('first date is smaller');

FIDDLE

【讨论】:

  • 嘿@plalx 谢谢你,我已经尝试更新我的小提琴,但在将输入日期与我的范围进行比较时仍然存在问题。你能告诉我哪里可能出错了吗? jsfiddle.net/qA9NT/10
  • @styler 你的日期范围是错误的。例如,10 岁以下的最小日期是 2005 年,而最大日期是 2004 年。
  • 感谢您告诉我!!我没有意识到我把它们弄混了:/
【解决方案2】:

使用Date 对象而不是字符串。

您可以使用

获取Date对象
dateInput._d

【讨论】:

  • 嘿@Oriol,我有点困惑是否需要使用 Date() 在我的 ageLimits 对象中设置每个日期?
  • 是的,您应该将 ageLimits 转换为 Date 对象,并与dateInput._d进行比较
【解决方案3】:

我不确定您的日期标准是什么,但如果它严格基于年份,您可以使用以下方法获得过去的确切日期:

var yearsAgo=10

var d=new Date();
d.setYear( d.getFullYear() - yearsAgo) ;

不需要对您的测试日期进行任何硬编码,并且始终从今天的日期开始计算

然后可以直接比较日期对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多