2016-04-19 22 views
-2

私は来年の特定の日付の平日を計算するのにいくつかの問題があります。たとえば、火曜日、19. 2016年4月は指定された日付です。今、私は計算します:火曜日、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.timeanddate.com/date/doomsday-weekday.html – MichaelChan

+0

あなたは毎年4月の第3火曜日をお探しですか? – RobG

答えて

1

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>'); 
 
});

以上、任意の年の任意の日のために働くLEAPまたはそれ以外のだろう。

ただし、一部の日付では、次の月または前月に移動することを意味します(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; 
} 
関連する問題