2016-04-19 58 views
-2

我计算明年某个日期的工作日有一些麻烦。例如:星期二,2016年4月19日是给定日期。现在我会计算:2017年4月18日星期二。平日总是一样非常重要。Javascript计算明年同一工作日

我的问题是闰年。我希望你能帮助我。

$('.changeYear').click(function() { 
     var appointments = []; 
     for (var i = 1; i <= 22; i++) { 
      var date = $('#tr-fix-tag-' + i).val(); 
      if (date !== "") { 
       var splittedDate = date.substr(5).split('.'); 
       appointments.push(new Date(splittedDate[2], splittedDate[1] - 1, splittedDate[0])); 
      } 
     } 

     var counter = 1; 
     $.each(appointments, function() { 
      var field = $('#tr-fix-tag-' + counter); 
      var date = $(this)[0]; 
      var newDate = new Date(date.setFullYear(date.getFullYear() + 1)); 

      if (isSchaltjahr(newDate.getFullYear())) 
       field.val(formatDate(new Date(newDate.setDate(newDate.getDate() - 2)))); 
      else 
       field.val(formatDate(new Date(newDate.setDate(newDate.getDate() - 1)))); 

      counter++; 
     }); 
    }); 
+0

尝试结帐世界末日算法。这个数学公式应该给你一个关于如何编码的想法.http://www.timeanddatedate.com/date/doomsday-weekday.html – MichaelChan

+0

那么你是否在寻找说每年四月的第三个星期二? – RobG

回答

1

如果你想一年增加并保持一天一样,可以通过调整不过多天的结果日期必须在同一天的日期最近的,例如

function sameDayNextYear(d) { 
 
    // Copy date 
 
    var t = new Date(+d); 
 
    // Get current day number 
 
    var startDayNum = d.getDay(); 
 
    // Add one year 
 
    t.setFullYear(t.getFullYear() + 1); 
 
    // Move to closest day that is the same day number 
 
    var diff = startDayNum - t.getDay(); 
 
    // If diff is more than 3 days, need to subtract rather than add 
 
    diff = (diff > 3) ? diff-7 : diff; 
 
    t.setDate(t.getDate() + diff); 
 
    return t; 
 
} 
 

 
[new Date(2016, 1, 13), // Sat 13 Feb 2016 - Sat 11 Feb 2017 
 
new Date(2016, 1, 5), // Fri 05 Feb 2016 - Fri 03 Feb 2017 
 
new Date(2016, 1, 6), // Sat 06 Feb 2016 - Sat 04 Feb 2017 
 
new Date(2016, 1, 29), // Mon 29 Feb 2016 - Mon 27 Feb 2017 
 
new Date(2016, 2, 1)] // Tue 01 Mar 2016 - Tue 28 Feb 2017 
 
.forEach(function(d) { 
 
    document.write(d + '<br>' + sameDayNextYear(d) + '<br><br>'); 
 
});

以上会为任何一天的工作在任何一年,飞跃或以其他方式。

但是,对于某些日期,这意味着它将转到下一个月或前一个月(例如2016-03-01转到2017-02-28)。如果您不希望发生这种情况,可以比较开始月份和结束月份,并添加或减去一周以恢复原始月份(所以到2017-03-07)。

0

我会利用这一点,并走在你的目标日当天的方向:

var DayOfWeek=[ 
    "Sunday", 
    "Monday", 
    "Tuesday", 
    "Wednesday", 
    "Thursday", 
    "Friday", 
    "Saturday" 
] 

function GetDayOfWeek(year, month, day) 
{ 
    var monthAdjust = [ 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 ]; 
    year -= (month < 3) ? 1 : 0; 
    var leap = Math.floor(year/4); 
    var greg = Math.floor(year/100); 
    var modern = Math.floor(year/400); 

    return DayOfWeek[(year + leap - greg + modern + monthAdjust[month - 1] + day) % 7]; 
} 
0

这是我能得到它的工作的最快方式。这可能可以优化很多。

这里是一个DEMO https://jsfiddle.net/92fLoryo/

几乎是它获得明年的日期,然后它减去,并增加了7天,该日期寻找同样的工作日。它会选择离日期最近的。

function getNextYearWeekday(today) 
{ 
    var weekday = today.getDay(); 
    var temp = new Date(); 
    temp.setYear(today.getFullYear() + 1); 

    var previous = 0; 
    var next = 0; 

    // Check Previous Days 
    for (var i = 0; i < 7; i++) 
    { 
    temp.setDate(today.getDate() - i); 
    console.log(temp); 
    if (weekday == temp.getDay()) 
    { 
     previous = i; 
    } 
    } 

    // reset the date 
    temp = new Date(); 
    temp.setYear(today.getFullYear() + 1); 

    // Check Next Days 
    for (var i = 0; i < 7; i++) 
    { 
    temp.setDate(today.getDate() + i); 
    console.log(temp); 
    if (weekday == temp.getDay()) 
    { 
     next = i; 
    } 
    } 

    // reset the date 
    temp = new Date(); 
    temp.setYear(today.getFullYear() + 1); 

    // find out which one is closer 
    if (previous < next) 
    temp.setDate(temp.getDate() - previous); 
    else 
    temp.setDate(temp.getDate() + next); 

    return temp; 
}