【问题标题】:Default date format of Javascript/JqueryJavascript/Jquery 的默认日期格式
【发布时间】:2014-06-10 05:55:34
【问题描述】:

我有一个剑道日期选择器,将日期设置为“MM/dd/yyyy”。我想使用 jquery/javascript 检查是否剑道日期选择器日期不能是未来日期并且日期必须大于“01/01/1900”。

我面临的问题是当我在脚本中获取新日期时,就像Date {Tue Jun 10 2014 11:17:48 GMT+0530 (India Standard Time)}。我的剑道日期选择器具有06/02/2012 格式的值。我不知道如何比较它。

我知道剑道日期选择器中有一个名为:parseFormats 的方法,我必须在其中提供解析格式,但我不知道 Javascript/Jquery 的默认日期格式,也不知道该怎么做。

剑道日期选择器

@(Html.Kendo().DatePickerFor(m => m.DateOfBirth).Format("MM/dd/yyyy").HtmlAttributes(new { style = "width:100%", Placeholder = "mm/dd/yyyy" }).Max(DateTime.Now.Date).Min(new DateTime(1900, 1, 2).Date))

【问题讨论】:

标签: javascript jquery date kendo-ui kendo-datepicker


【解决方案1】:

您正在获取新日期的 toString 值。试试这个

var d = new Date(datepicker.value()); // looked at the docs, no obvious shortcut
if (d.getFullYear()<1900) alert("nope");

或

var now = new Date(), d = new Date(datepicker.value());
now.setHours(0,0,0,0); // normalise
if (d.getTime() > now.getTime()) alert("Please no future dates");

更多关于JS日期的信息:MDN

您还可以使选择无效日期变得更加困难

$("#datetimepicker").kendoDateTimePicker({
  value:new Date(),
  min: new Date(1900,0,1), // JS months are 0 based!
  max: new Date()
});

最后添加验证

$("#MyForm").kendoValidator({
  rules: {
    //implement your custom date validation
    dateValidation: function (dateField) {
        var currentDate = Date.parse($(dateField).val());
        //Check if Date parse is successful
        if (!currentDate) {
            return false;
        }

        var now = new Date(), then=new Date(1900,0,1),d = new Date($(dateField).val());
        now.setHours(0,0,0,0); // normalise
        return d.getTime() >= then.getTime() && d.getTime() < now.getTime()  
    }
  },
  messages: {
    //Define your custom validation massages
    required: "Date is required message",
    dateValidation: "Invalid date message"
  }
});

【讨论】:

  • 什么是未来日期验证?
  • @Dhwani 你可以检查一下 if (d.getFullYear()&gt;getdate().getFullYear())
  • @mplungjan 我对 .getTime 的工作原理感到困惑?
  • 在应用时区修正后获取日期对象自 EPOCH (1/1/1970) 以来的毫秒数
【解决方案2】:

Javascript 的默认日期格式是 MM/DD/YYYY

供参考关注Date Format

【讨论】:

    【解决方案3】:

    我几乎会完全忽略 Kendo 的方法,并在您提交时在验证功能中使用 moment.js。您可以将每个日期、最小值、最大值和候选日期格式化为 YYYY-MM-DD,然后使用内置的 .isAfter() 和 .diff() queries 进行比较。请记住,您必须考虑他们是否输入了某些内容,而不仅仅是从日历中选择它,因此您必须确保您有 2 位数的天数。您还必须考虑是否有人输入了高于剑道控制能力的令人发指的内容,例如 1/1/0001 和 1/1/9000。下面的代码处理这个问题。您也可能 - 虽然我没有在我的代码中包含它,但在我的小提琴中做了 - 如果年份只有 2 位数字,也需要考虑:

    $('#btnValidate').click(function(){
         var minDate = moment('1900-1-1');
         var maxDate = moment(Date.parse(new Date()));
    
         //var dateField = $("#datepicker").data("kendoDatePicker").value();
         var dateField = $("#datepicker").val();
    
         // Moment requires YYYY-MM-DD
         dateField = dateField.replace('/','-').replace('/','-');
         var year = dateField.split('-')[2];
         var month = dateField.split('-')[0];
         var day = dateField.split('-')[1];
    
         if (month < 10 && month.toString().length == 1) { month = "0" + month; }
         if (day < 10 && day.toString().length == 1) { day = "0" + day; }
         dateField = year + '-' + month + '-' + day;
    
         // Enter into moment and compare
         var dateToConsider = moment(dateField);
         var lowerLimitBreached = dateToConsider.diff(minDate) < 0;
         var upperBoundBreached = dateToConsider.isAfter(maxDate);
    
         alert('min: ' + moment(minDate).format('MM/DD/YYYY'));
         alert('max: ' + moment(maxDate).format('MM/DD/YYYY'));
         alert('our candidate: ' + moment(dateToConsider).format('MM/DD/YYYY'));
    
         if(lowerLimitBreached || upperBoundBreached)
             alert('Invalid date');
         else
             alert('Valid date');
     });
    

    http://jsfiddle.net/navyjax2/k5xx9xpu/

    请注意,该示例未显示使用时间,但如果您从 .data("kendoDatePicker").value 注释掉的行中获得时间,您可以添加这一点。我只是不相信年份,因为“0001”将翻译为“1901”。所以我想说将时间附加到dateField 对象将是可行的方法,您可以像moment(year + '-' + month + '-' + day + 'T' + hours + ':' + mins + ':' + secs + 'Z').utc() 和像moment('1900-1-1T00:00:00Z') 这样的分钟硬编码时间,尽管00:00:00Z 已经隐含如果你不设置它。

    【讨论】:

      【解决方案4】:

      您可以使用 KendoUI 的 datepicker 方法,如下所示:

        var datepicker = $("#datepicker").data("kendoDatePicker");
        var value = datepicker.value();
      

      这里的值将持有像Tue Oct 11 2015 11:17:48 GMT+0530 (India Standard Time)这样的值

      现在您可以使用简单的条件来比较值

      编辑

      你可以参考这个fiddle的演示

      一旦你有了 javascript 日期格式,你就可以使用条件来比较日期,就像我在演示代码中所做的那样

      【讨论】:

      • 日期选择器的值可能是 06/02/2012 而 Dhwani 正在使用 new Date() 并且没有意识到他正在获取它的 toString
      • @mplungjan 请详细说明一下。我无法得到你
      • 您的代码运行不正常。您的日期是 1900/02/01 而不是 1900/01/01,因为 JS 月份是从 0 开始的。此外,如果您键入日期 jsfiddle.net/tJ6EB
      • @mplungjan 可以理解是 1900/02/01 还是 1900/01/01,我们正在尝试帮助参考代码,而不是提供完美的代码。
      • 我不同意。如果初学者得到错误的参考代码,他们会非常困惑。请尽量提供完美的代码。
      猜你喜欢
      • 2017-08-28
      • 2018-02-12
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 2016-01-25
      • 1970-01-01
      • 2013-05-09
      相关资源
      最近更新 更多