【问题标题】:JQuery DateTimePicker UI getting total days between two datetimepickersJQuery DateTimePicker UI 获取两个日期时间选择器之间的总天数
【发布时间】:2016-11-09 22:19:28
【问题描述】:

我正在尝试从我拥有的两个自定义 DateTimePickers 中获取总天数。

我试过这个功能:

 function dateDifference() {
if($("#fradato").val()!='' && $("#fradato").val()!='') {
var diff = ($("#fradato").datepicker("getDate") - $("#tildato").datepicker("getDate")) / 1000 / 60 / 60 / 24;
$("#antalldager").val(diff)

我遇到的问题是,无论我在哪里尝试调用此函数,DateTimePicker 都会停止工作。那么我应该在哪里/如何调用这个函数,或者有更好的方法吗?

我想在这个文本框内显示总天数:

 <div class="form-group">
   <label class="control-label col-sm-1 col-sm-offset-3"     for="antalldager">Antall dager:</label>
 <div class="col-sm-2">
<input type="text" class="form-control" id="antalldager" disabled>

这是我的html:

 <script>valgavdato() </script>
<div  id="visdager" style="display: none;">
<label class="control-label col-sm-2 col-sm-offset-3" for="fradato">Book fra:</label>
  <div class="container">
      <div class="row">
          <div class='col-sm-2'>
              <div class="form-group">
                  <div class='input-group date'>
                      <input type="text" id="fradato" class="form-control"/>
                      <span class="input-group-addon">
                          <span class="glyphicon glyphicon-calendar"  ></span>
                      </span>
                  </div>
              </div>
          </div>
      </div>
  </div>
  <div id="vistildato" style="display: none;">
    <label class="control-label col-sm-2 col-sm-offset-3" for="tildato">Book til:</label>
  <div class="container">
      <div class="row">
          <div class='col-sm-2'>
              <div class="form-group">
                  <div class='input-group date'>
                      <input type="text" id="tildato" class="form-control" />
                      <span class="input-group-addon">
                          <span class="glyphicon glyphicon-calendar"></span>
                      </span>
                  </div>
              </div>
          </div>
      </div>
  </div>

JS:

   $( function valgavdato() {
var dateFormat = "mm/dd/yy",
    to_MaxDate = 13;    // From date + this = to maxDate

    from = $( "#fradato" )
.datepicker({
    minDate: '0+',
    defaultDate: "+1w",
    changeMonth: true,
    numberOfMonths: 1

})
.on( "change", function() {
    var PickedDate = getDate( this );
    // See that date is in UTC format.
    console.log( "From DatePicker: "+JSON.stringify(PickedDate) );

    // Process the picked date.
    var tempDay = PickedDate.getDate() + to_MaxDate; // Add a number of days to the picked date.
    var tempMonth = PickedDate.getMonth() + 1;   // Because months are zero based.
    var tempYear = PickedDate.getYear() + 1900; // Because years are 1900 based
    console.log( "Temp date: "+ tempYear+"/"+tempMonth+"/"+tempDay +" --- It may look impossible... But Date() handles it.");

    // Create a date object in a UTC format.
  var newMaxDate = new Date(Date.UTC(tempYear, tempMonth-1, tempDay, 0, 0, 0));
    console.log(  "New max date: : "+ JSON.stringify(newMaxDate) );

    // Set the minDate ans maxDate options.
    to.datepicker( "option", {"minDate": PickedDate, "maxDate": newMaxDate});
}),
    to = $( "#tildato" ).datepicker({
        maxDate: '14+',
        defaultDate: "+1w",
        changeMonth: true,
        numberOfMonths: 1
    })
.on( "change", function() {
    from.datepicker( "option", "maxDate", getDate( this ) );
});

function getDate( element ) {
    var date;
    try {
        date = $.datepicker.parseDate( dateFormat, element.value );
    } catch( error ) {
        date = null;
    }
    return date;
}
} );

function dateDifference() {
if($("#fradato").val()!='' && $("#fradato").val()!='') {
    var diff = ($("#fradato").datepicker("getDate") - $("#tildato").datepicker("getDate")) / 1000 / 60 / 60 / 24;
    $("#antalldager").val(diff)
}
}

【问题讨论】:

  • 日期计算总是非常棘手(太多的例外、不同的月份长度、时区、冬季/夏季时间)。可能值得看看一些实现,例如momentjs.com/docs/#/displaying/difference
  • 嗯,好的,我会检查一下。所以我可以使用 Moment 函数,并以某种方式获取时刻内的日期来计算差异?
  • 是的,没错

标签: jquery jquery-ui datetimepicker


【解决方案1】:

我认为@JanisP 建议很好。您还可以创建一个轻量级函数,例如:

function dateDifference(start, end) {
  // Assume Start and End string format: dd/mm/yyyy
  var d1 = new Date(start);
  var d2 = new Date(end);
  // d2 - d1 gives result in milliseconds
  // calculate number of days by Math.abs((d2-d1)/86400000, as 24*3600*1000 = 86400000
  return Math.abs((d2-d1)/86400000)
}

在这里找到这个:jQuery UI Datepicker - Number of Days Between Dates

更新

jQuery UI Datepicker Select a Date Range 示例中,我创建了这个工作示例:https://jsfiddle.net/Twisty/r8wx6afk/

仅当两个字段在 change 事件期间都有日期时,它才会计算天数。

【讨论】:

  • 很多人建议使用onSelect。但是我尝试了多种使用 onSelect 的方法,但我还没有让它工作,有什么建议可以在我当前的脚本中做到这一点吗?
  • 您可以在第二个日期选择器的select 事件中执行dateDifference()。看看我是否可以从您的代码中创建一个示例。
  • @StianJohansen 我用一个工作示例更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多