【问题标题】:Update Date with Javascript into Textbox add Months and correct year etc使用 Javascript 将日期更新到文本框中添加月份和正确的年份等
【发布时间】:2014-02-25 05:22:39
【问题描述】:

所以前提是有一个表示开始日期的文本框,然后另一个输入框onchange 应该运行一个javascript函数,将任期框中的月份值添加到合同开始日期并给出合同结束日期。

我尝试了以下代码:

<form name="FormName">
Contract Start Date: <input type="text" name="Start" value="<?php echo date("Y/m/d"); ?>" onchange="myFunction()" />
<br />
Tenure (Months): <input type="text" name="Months" value="" onchange="myFunction()" />
<br />
Contract End Date: <input type="text" name="TextBoxName" value="" />

</form>

<script>
function myFunction()
{
var val = document.forms["FormName"].elements["Months"].value;
var d = new Date(document.forms["FormName"].elements["Start"].value);
var year = d.getFullYear();
var month = d.getMonth() + val;
var day = d.getDate();
document.forms["FormName"].elements["TextBoxName"].value = year + "/" + month + "/" + day;
}
</script>

但这似乎并没有将其作为日期对象处理,我得到的值类似于 2014/22/31 ,其中 22 是月份,显然应该延续到年份组件。

我猜当 var 被定义为单独的年、月、日部分时,它会将其视为字符串...我需要它返回格式为 PHP 中 date("Y/m/d"); 的日期.

任何帮助将不胜感激!

【问题讨论】:

  • 尝试从更新的值构造一个新的日期
  • 您为什么要在您的月份中添加 + val?我认为这是问题所在。
  • getMonth() 返回一个数字 (0-11),您只是将另一个数字添加到该数字,因此 12 月日期(月份数 11)加上 10 个月会得到 21。它不会调整 Date 对象,为此使用setMonth()

标签: javascript php


【解决方案1】:

正如@user2310289 建议的那样,你应该这样做:

var endDate = new Date(d.setMonth(d.getMonth()+val));
var year = endDate.getFullYear();
var month = endDate.getMonth();
var day = endDate.getDate();

【讨论】:

    【解决方案2】:

    试试这个:

    // let your contract start date be '2013/12/11'
    var c_start_date = '2013/12/10';
    var tenure = 5; // 5 months
    
    var c_start_date_obj = new Date(c_start_date);
    
    var c_end_date_obj = new Date(c_start_date_obj.getFullYear(), c_start_date_obj.getMonth() + tenure, c_start_date_obj.getDate());
    
    var c_end_date = c_end_date_obj.getFullYear() + '/' + c_end_date_obj.getMonth() + '/' + c_end_date_obj.getDate();
    
    alert(c_end_date);
    

    JSFiddle link

    【讨论】:

    • 那么 2014 年 1 月 31 日 + 1 个月 => 2014 年 3 月 3 日?您也没有考虑到月份索引是 0 到 11,而不是 1 到 12 (cf c_end_date_obj.getMonth())。
    • @RobG:根据问题,日期格式必须为y/m/d。因此,当我将其转换为日期格式时,就不需要维护从 0 到 11 的月份。日期对象new Date() 会自动执行此操作。
    • new Date() 无关(根据我对 OP 的评论,这是有缺陷的),而是格式化返回的字符串(根据我对您的回答的评论)。
    【解决方案3】:

    您的第一个问题是正确解析日期字符串。您使用的格式不是 ES5 中指定的格式,因此除非您自己解析,否则它将完全依赖于实现。所以:

    // Parse y/m/d to create a Date
    function parseString(s) {
      s = s.split(/\D/);
      return new Date(s[0], --s[1], s[2]);
    }
    

    将字符串转换为日期后,您可以添加月份:

    var d = parseString(document.forms["FormName"].elements["Start"].value);
    
    // Copy d for use later
    oDate = d.getDate();
    d.setMonth(d.getMonths() + Number(val));
    

    您将在某些情况下将月份添加到 7 月 31 日的日期,然后计算结果为 6 月 31 日,该日期将自动转换为 7 月 1 日。

    您可以通过查看日期来解决此问题。如果调整日期与开始日期不同,则将调整日期设置为上个月的最后一天,将日期设置为 0,例如

    if (d.getDate() != oDate) {
      d.setDate(0);
    }
    

    请注意,减去月份可能无法让您回到起点,例如

    Jan 31 + 1 month => 28 Feb // for a non-leap year
    28 Feb - 1 month => 28 Jan
    

    【讨论】:

      【解决方案4】:

      经过大量的玩耍和搜索,我实现了datejs 库。这解决了我遇到的很多问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-03
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 2022-01-19
        相关资源
        最近更新 更多