【问题标题】:How to calculate and display a specific date? [closed]如何计算和显示特定日期? [关闭]
【发布时间】:2014-12-18 15:49:27
【问题描述】:

我正在为电子商务/租赁网站编写在线合同,需要显示第一次付款的日期。

第一笔付款应在每月 1 日或 15 日的第一次发生时到期,从合同签订之日起 30 天开始。因此,如果合同是在 1 月 10 日填写的,那么第一笔付款将在 2 月 15 日到期。

我不知道如何使用 JS 实现这一点,因此非常感谢您的帮助。谢谢!

编辑

假设我正在使用以下推荐的代码:

function calc() {
    var invoiceDate = moment(document.getElementById("contractDate").value, ["M-D-YYYY"]).add(30, 'days');

    while (invoiceDate.date() != 1 && invoiceDate.date() != 15) {
        invoiceDate = invoiceDate.add(1, 'days')
    }
    document.getElementById("invoiceDate").innerHTML = invoiceDate.format("MMMM Do, YYYY");
}

calc()



<script type='text/javascript' src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.js"></script>
<input type="text" id="contractDate" onchange="calc()" value="12-18-2014">
<div id="invoiceDate"></div>

如何将其设置为自动更新到当前日期,而不需要填写文本表单?摆脱文本输入将最好防止人们捏造合同。有什么建议吗?

【问题讨论】:

  • 只是一些简单的数学运算和Date Object
  • 我会看看moment.js。这将使您在使用 javascript 操作日期方面变得更加轻松。
  • 如果日期是Jan 15,还会是Feb 15吗?还是跳转到Mar 1? (它必须是 +30 但不能落在 30 我猜是问题)
  • @BradChristie 在这种情况下,第一个付款日期是 2 月 15 日。

标签: javascript html asp.net date


【解决方案1】:

这可以使用纯 javascript 以相当直接的方式完成

function calc(){
  var contractDate = new Date(document.getElementById("contractDate").value)
  console.log('contractDate',contractDate);

  var invoiceDate = new Date(contractDate);
  invoiceDate.setDate(invoiceDate.getDate() + 30)

  while( invoiceDate.getDate() != 1 && invoiceDate.getDate() != 15){
    invoiceDate.setDate(invoiceDate.getDate() + 1)
  }
  document.getElementById("invoiceDate").innerHTML = invoiceDate;
}

calc()
<input type="text" id="contractDate" onchange="calc()" value="2014-01-10">
<div id="invoiceDate"></div>

但是,正如评论所说,处理日期远比最初看起来要复杂得多,请使用 momentjs 之类的东西

function calc(){
  var invoiceDate = moment(document.getElementById("contractDate").value,["YYYY-MM-DD"]).add(30,'days');
   
  while( invoiceDate.date() != 1 && invoiceDate.date() != 15){
    invoiceDate = invoiceDate.add(1,'days')
  }
  document.getElementById("invoiceDate").innerHTML = invoiceDate.format("YYYY-MM-DD");
}

calc()
<script type='text/javascript' src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.js"></script>
<input type="text" id="contractDate" onchange="calc()" value="2014-01-10">
<div id="invoiceDate"></div>

【讨论】:

  • 这几乎是完美的!有没有办法自动更新输入字段中设置的日期?
【解决方案2】:

这是我的出价:

// http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.min.js

function getNextBillingDate(d){
    var m = new moment(d);
    m = m.add(1, 'month');
    if (m.date() > 15){
        m = m.add('1', 'month').date(1);
    } else if (m.date() > 1) {
        m = m.date(15);
    }
    return m.toDate();
}

var t = document.getElementById('t');
function test(input,expected){
    var actual = getNextBillingDate(input);
    
    var im = new moment(input),
        em = new moment(expected),
        am = new moment(actual);
    
    t.innerHTML += im.format('L') + ' => ' + am.format('L');
    t.innerHTML += ' (' + (em.isSame(am) ? 'PASS' : 'FAIL') + ')' + '\r\n';
}
test(new Date('Jan 10, 2016'), new Date('Feb 15, 2016'));
test(new Date('Jan 15, 2016'), new Date('Feb 15, 2016'));
test(new Date('Jan 16, 2016'), new Date('Mar 1, 2016'));
test(new Date('Mar 1, 2016'), new Date('Apr 1, 2016'));





// Only scroll down if you care about the input field in the demo
$('#d').val(moment().format('L'));
$('#b').on('click', function(e){
  try {
    var d = new moment(getNextBillingDate(new Date($('#d').val())));
    $('#r').text(d.format('L'));
  } catch(ex) {
    $('#r').text('Error');
  }
});
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.min.js"></script>

<input type="date" id="d" /><button id="b">Convert</button><span id="r"></span>

<pre id="t">Unit Tests:
</pre>

【讨论】:

    【解决方案3】:

    查看一个名为 MomentJS

    你会做以下事情:

    moment(beginning date here, format here).add(30, 'days')  
    

    所以在你的情况下,这将导致:

    moment("15-01-2014", ["DD-MM-YYYY"]).add(30, 'days')
    

    这是在 DayDay-MonthMonth-YearYearYearYear 表示法中,但将其更改为您的愿望。
    在这行代码之后,您有一个时刻对象。 就我而言,我使用以下方法从中检索日期:

    getDateFromMoment(moment){
        var currentDay = moment.date();
          if(currentDay < 10){
              currentDay = '0' + moment.date();
          }
          var currentMonth = moment.month() + 1;
          if(currentMonth < 10){
              currentMonth = '0' + (moment.month() + 1);
          }
          var currentYear = moment.year();
          return currentDay + "-" + currentMonth + "-" + currentYear;
    }
    

    这将返回一个字符串形式的日期,例如“15-02-2014”。
    框架本身可能需要一点“习惯”,但向我保证.. 值得你花时间

    这个框架的优点:

    1. 简单易学
    2. 将通过年份变化、2 月的不一致、53 或 52 周的年份、日期问题可能给您带来的任何问题正确计算,MomentJS 可以满足您的需求!
    3. 您可以将其自定义到您的应用程序中,更改语言环境、格式,您可以输入的不仅仅是字符串日期对象,还可以是 JavaScript 对象,等等。

    希望我能帮到你;)

    【讨论】:

    • 你正在使用momentjs,但是把它变成了字符串操作......呃! &lt;/disappointed&gt;
    • 另外,I tried this 它给出了错误的结果。
    • 但这返回了正确的结果,因为 Januari 只有 30 天,因此它返回 14-02 :|我也明白为什么字符串操作不好
    猜你喜欢
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    相关资源
    最近更新 更多