【问题标题】:How do I roll a date forward to a specified day in Javascript?如何在Javascript中将日期前滚到指定日期?
【发布时间】:2013-04-01 13:57:10
【问题描述】:

我正在处理一个表单,该表单需要以格式('MMDDYYYY')自动计算提交表单的日期,然后单击两个链接中的一个链接,计算最接近的第一天下个月,以及下个月最近的第 15 天。

我已经创建了一个脚本,它可以提取日期并将其输出到我需要的格式的变量中,但我需要帮助来计算前滚。

这是我认为需要的逻辑示例:

如果当前日期是 04092013,则在按下标有“即将到来的 1 日”的按钮时,将计算 05012013 的变量值。

如果当前日期为 04092013,则在按下标有“即将到来的 15 日”的按钮时,将计算出变量值 04152013。

如果当前日期为 04162013 或截至当前月末的任何日期,则在按下标有“即将到来的 15 日”的按钮时,将计算变量值 05152013。

【问题讨论】:

标签: javascript jquery date date-arithmetic


【解决方案1】:

试试

function getDate() {
    var s = document.getElementById('date').value;
    if(s){
        return new Date(s.substring(4), parseInt(s.substring(2, 4), 10) - 1, s.substring(0, 2))
    }
}

function comingDate(date, day){
    date = new Date(date);
    var cday = date.getDate();
    date.setDate(day);
    if(cday >= day){
        date.setMonth(date.getMonth() + 1)
    }
    return date
}

function f15(){
    var d = getDate();
    var next = comingDate(d, 15);
    console.log(next)
}

function f1(){
    var d = getDate();
    var next = comingDate(d, 1);
    console.log(next)
}

演示:Fiddle

【讨论】:

  • 谢谢阿伦。我在 jFiddle 中尝试过,它似乎不起作用?
【解决方案2】:

既然您知道日期的格式,请将输入分成几部分:

var dateStr = '04092013'
var month = dateStr.substr(0,2);
var day = dateStr.substr(2,2);
var year = dateStr.substr(4,4);

根据您要设置的规则构造一个新的日期:

var newDate;
switch(rule)
{
  case 'rule1':
  newDate = new Date(year, month, 1);//first month is 0
  break;
  case 'rule2':
  newDate = new Date(year, month, 15);//first month is 0
  break;
}
  • 记得检查一天是否大于 15。

【讨论】:

    【解决方案3】:

    这是一个例子。如果您希望将其作为字符串返回,则必须在最后根据需要对其进行格式化(使用 UTC )。

    如果您输入的日期与您要求的日期编号相同,它将返回同一天,而不是向前移动一个月。

    var date_string = '04092013';
                    // MMDDYYYY
    
    function nextNthOfMonth(date_string, n) {
        var date;
        // n to Int, default 1
        n = (+n || 1);
        // date_string to ISO 8601
        date_string = // "yyyy-MM-ddTHH:mm:ssZ"
              date_string.slice(4)
            + '-' + date_string.slice(0, 2)
            + '-' + date_string.slice(2, 4)
            + 'T00:00:00Z';
        // construct date object
        date = new Date(date_string);
        // fix to desired date
        if (n < date.getUTCDate()) { // adjust for month if req.
            date.setUTCMonth(date.getUTCMonth() + 1);
        }
        date.setUTCDate(n);
        return date; // or format as desired
    }
    
    nextNthOfMonth(date_string, 1);
    // Wed May 01 2013 01:00:00 GMT+0100 (GMT Daylight Time)
    nextNthOfMonth(date_string, 15);
    // Mon Apr 15 2013 01:00:00 GMT+0100 (GMT Daylight Time)
    

    【讨论】:

      【解决方案4】:

      查看 Date 对象,它应该提供您所需要的:

      https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

      例如,前 2 个按钮是这样的:

      $(function() {
          var date = new Date(2013, 10, 24);
      
          $("#date").html(date.toString());
          $("#date1").html((new Date(date.getYear(), date.getMonth()+1, 1)).toString());
          $("#date2").html((new Date(date.getYear(), date.getMonth()+1, 15)).toString());
      });
      

      (尽管如果您查看日期文档,我确信有更简单的方法可以做到这一点)

      【讨论】:

      • 谢谢。这是一个有用的链接。我会看一下,看看我是否可以从那里收集一些知识。
      • 这行得通。我只是应用了我已经编写的脚本来重新格式化日期对象的输出,我得到了答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多