如何根据给定的开始日期和字词持续时间动态设置结束日期?

时间:2016-03-11 00:42:25

标签: javascript ruby-on-rails date javascript-events datepicker

我想根据期限类型(年度,半年度,季度,月份)和期限开始日期动态设置期限结束日期。

Form

因此,如果我们将术语设置为年度且开始日期设置为03/10/2016,则术语“结束”应设置为03/10/2017。

这是我到目前为止所做的,但不确定如何处理术语类型(年度= = 12个月等)。我也得到了日期格式的控制台错误。任何帮助或指示将不胜感激。

.field
  = f.label :term_start_date, 'Term Start', class: 'label'
  .input
    = f.date_field :term_start_date, id: 'termStart'
.field
  = f.label :term_end_date, 'Term End', class: 'label'
  .input
    = f.date_field :term_end_date, id: 'termEnd'
    :javascript
      $("#termStart").val();
      $("#termEnd").val({
          onSelect: function () {
              var toDate = $(this).val('getDate');
              toDate.setDate(toDate.getDate()+7)
              $("#termStart").val("setDate", toDate);
          }
      });

The specified value "[object Object]" does not conform to the required format, "yyyy-MM-dd".

2 个答案:

答案 0 :(得分:1)

您尝试的并不困难,但还有一些工作要做。日期库可以提供帮助,但编写自己的方法并不需要花费很多精力。你需要做一些事情:

  1. 解析并验证输入开始日期
  2. 获取期限并在开始日期添加几个月
  3. 处理无效输入
  4. 显示结果
  5. 以下内容并未使用任何jQuery(如果您愿意,可以使用它,但它不会提供任何好处),并且应该让您知道需要做什么。

    
    
    var dLib = {
    
      // Given a date string in format m/d/y, return a Date instance
      parseMDY: function (s) {
        var b = s.split(/\D+/);
        var d = new Date(b[2], --b[0], b[1]);
        return /\d{1,2}\/\d{1,2}\/\d{1,4}/.test(s) &&
               d.getMonth() == b[0]? d : new Date(NaN);
      },
    
      // Given a Date, return date string formatted as mm/dd/yyyy
      formatMDY: function (date) {
        function z(n){return (n<10?'0':'')+n}
        if (isNaN(date)) return date.toString();
        return z(date.getMonth() + 1) + '/' + z(date.getDate()) + '/' + date.getFullYear();
      },
    
      // Add months to a date. If end date itn's equal to start date,
      // must have gone past end of month so set to last day of month
      addMonths: function (date, months) {
        var startDate = date.getDate();
        date = new Date(+date);
        date.setMonth(date.getMonth() + Number(months))
        if (date.getDate() != startDate) {
          date.setDate(0);
        }
        return date;
      },
    };
    
    function setTermEnd(el) {
      var form = el.form;
      var term = form.termInMonths.value;
      var startDate = dLib.parseMDY(form.termStart.value);
      
      // Check that a valid date was entered. If no date entered
      // yet, do nothing. Else, put error message in termEnd
      if (isNaN(startDate)) {
        form.termEnd.value = form.termStart.value == ''? '' : 'Term start date is invalid';
        
      // Add months and set term end
      } else {
        form.termEnd.value = dLib.formatMDY(dLib.addMonths(startDate, term));
      }
    }
    
    // Attach listeners and run to initialise
    window.onload = function() {
      var form = document.forms[0];
      form.termInMonths.onchange = function() {setTermEnd(this)};
      form.termStart.onchange = function() {setTermEnd(this)};
      form.termStart.onchange(form.termStart);
    }
    &#13;
    .hint {
      color: #999999;
      font-size: 75%;
    }
    &#13;
    <form>
      <table>
       <tr><td>Term:<td><select name="termInMonths">
                          <option value="12" selected>Annual
                          <option value="6">Semi-annual
                          <option value="3">Quarter
                          <option value="1">Month
                        </select>
       <tr><td>Term start:<td><input name="termStart" value="1/31/2016"><span class="hint">m/d/y</span>
       <tr><td>Term End:<td><input name="termEnd" readonly><span class="hint">m/d/y</span>
      </table>
    </form>
    &#13;
    &#13;
    &#13;

答案 1 :(得分:0)

Javascript的内置日期时间操作非常有限。

您最好的选择是使用javascript日期时间库。 moment.js是个好人

你的第二个最好的选择是以秒为单位工作,因为这就是javascript的工作方式。使用Date.parse(toDate)将其转换为自纪元以来的秒数,然后添加秒数,然后将其转换回日期。