質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

5回答

649閲覧

JavaScriptのカレンダーのif文によるエラー

ntttt

総合スコア49

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/06/04 02:12

編集2019/06/05 11:51
const weeks = ['日', '月', '火', '水', '木', '金', '土']; const date = new Date(); let year = date.getFullYear(); let month = date.getMonth(); function showCalendar(year, month) { const calendarHtml = createCalendar(year, month); const sec = document.createElement("section"); sec.innerHTML = calendarHtml; document.querySelector("#calendar").appendChild(sec); month ++; if(month > 12) { year ++; month = 1; } } function createCalendar(year, month) { let today = date.getDate(); const startDate = new Date(year, month ,1); const endDate = new Date(year, month + 1, 0); const endDayCount = endDate.getDate(); const lastMonthEndDate = new Date(year, month , 0); const lastMonthendDayCount = lastMonthEndDate.getDate(); const startDay = startDate.getDay(); let dayCount = 1; let calendarHtml = ""; calendarHtml += `<h1>${year}/${month + 1}</h1>`; calendarHtml += "<table>"; calendarHtml += "<tr>" for(let i = 0; i < weeks.length; i++) { calendarHtml += "<th>" + weeks[i] + "</th>"; } calendarHtml += "</tr>" **ここからがカレンダーを作成するコードになります** for(let w = 0; w < 6; w++) { calendarHtml += "<tr>"; for(let d = 0; d < 7; d++) { if(w == 0 && d < startDay) {           //lastMonthendDayCountは先月の末日の数値           //startDayは今月の最初の日の曜日の数値 let num = lastMonthendDayCount - startDay + d + 1; calendarHtml += `<td class = "is-disabled">${num}</td>`; } else if(dayCount > endDayCount) {           //dayCountは1           //endDayCountは今月の末日の数値 let num = dayCount - endDayCount; calendarHtml += `<td class="is-disabled">${num}</td>`; dayCount ++;          //todayは今日の数値 } else if(dayCount < today) { calendarHtml += `<td class="calendar_td" data-date="${year}/${month}/${dayCount}">${dayCount}</td>`; dayCount ++; } else if(dayCount == today) { calendarHtml += `<td class="calendar_td today" data-date="${year}/${month}/${dayCount}">${dayCount}</td>`; } else if(endDayCount > today) { calendarHtml += `<td class="calendar_td" data-date="${year}/${month}/${dayCount}">${today}</td>`; today ++; console.log(today); } } calendarHtml += "</tr>"; } calendarHtml += "</table>"; return calendarHtml; } **ここまでがカレンダーを作成するコードになります** function moveCalendar(e) { document.querySelector("#calendar").innerHTML = ""; if(e.target.id === 'prev') { month --; if(month < 1) { year --; month = 12; } } if(e.target.id === "next") { month ++; if(month > 12) { year ++; month = 1; } } showCalendar(year, month); } document.querySelector("#prev").addEventListener("click", moveCalendar); document.querySelector("#next").addEventListener("click", moveCalendar);

JavaScriptを勉強中の者です。
カレンダーで今日の日付の場所にマークアップをしたいのですが、今のコードのままでは今日以降の日付が今日と同じ日付になってしまいます。
日付に関するコードは「ここからがカレンダーを作成するコードになります」以降から「ここまでがカレンダーを作成するコードになります」までとなります。
至らない点があるとは思いますが、お知恵を拝借できたら幸いです。
宜しくお願いします。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/06/04 03:16

とりえあずおかしい挙動でもよいのでコピペで動くソースを提示ください
m.ts10806

2019/06/04 04:00

タイトルには要件(起きている問題、実現したいこと)を記載してください。 タグにある内容や汎用的すぎる内容はあまり好ましくありません
guest

回答5

0

ベストアンサー

もっとロジックを考え直した方がよい。
appendChild 使えるなら innerHTML を不使用にしては?
変数 w が多すぎるときの問題は?
とにかくごちゃごちゃしすぎ。

javascript

1 for(let d = 0; d < 7; d++) { 2 if(w == 0 && d < startDay) { 3          //lastMonthendDayCountは先月の末日の数値 4          //startDayは今月の最初の日の曜日の数値 5 let num = lastMonthendDayCount - startDay + d + 1; 6 calendarHtml += `<td class = "is-disabled">${num}</td>`; 7 } else if(dayCount > endDayCount) { 8          //dayCountは1 9          //endDayCountは今月の末日の数値 10 let num = dayCount - endDayCount; 11 calendarHtml += `<td class="is-disabled">${num}</td>`; 12 dayCount ++; 13         //todayは今月の末日の数値 14 } else if(dayCount < today) { 15 calendarHtml += `<td class="calendar_td" data-date="${year}/${month}/${dayCount}">${dayCount}</td>`; 16 dayCount ++; 17 } else if(dayCount == today) { 18 calendarHtml += `<td class="calendar_td today" data-date="${year}/${month}/${dayCount}">${dayCount}</td>`; 19 dayCount ++; 20 } else { 21 calendarHtml += `<td class="calendar_td" data-date="${year}/${month}/${dayCount}">${dayCount}</td>`; 22 dayCount ++; 23 console.log(dayCount); 24 } 25 }

そのうち万年カレンダーでも書いてみようかなと思っていたので書いてみた。
先月と来月の余計な日付と、今日という存在がロジックを複雑にするね。
もうちょっと熟考する余地があるね。

html

1<html lang="ja"> 2<meta charset="utf-8"> 3<title></title> 4<style> 5td { 6 text-align: center; 7} 8tr td:first-Of-type { 9 color: red; 10} 11tr td:nth-Of-type(7) { 12 color: blue; 13} 14td.is-disabled { 15 color: silver !important; 16} 17td.today { 18 background: yellow; 19} 20 21</style> 22<body> 23 <div id="hoge"></div> 24 <input type="button" value="prev" id="prev"> 25 <input type="button" value="next" id="next"> 26 <hr> 27 <div id="fuga"></div> 28 <input type="button" value="prev" id="prev2"> 29 <input type="button" value="next" id="next2"> 30 31 32<script> 33 34{ 35 const 36 WEEK_JP = ['日', '月', '火', '水', '木', '金', '土'], 37 DATE_FN = ['getFullYear', 'getMonth', 'getDate', 'getDay'], 38 OPTION = { 39 40 }; 41 42 function addMonth (dt, n) { 43 dt.setMonth (dt.getMonth () + n); 44 return dt; 45 } 46 47 function getDTValue (dt = new Date) { 48 return DATE_FN.map (f => dt[f]()); 49 } 50 51 function removeChild (e) { 52 e.remove (); 53 } 54 55 //____________________ 56 57 function init () { 58 let 59 doc = this.parent.ownerDocument, 60 tbl = doc.createElement ('table'), 61 thd = tbl.createTHead (), 62 tr = thd.insertRow (); 63 64 tbl.createCaption (); 65 WEEK_JP.forEach (w => tr.insertCell ().textContent = w); 66 this.table = this.parent.appendChild (tbl); 67 } 68 69 //____________________ 70 71 class Calendar { 72 constructor (parent, dateObj = new Date, option = {}) { 73 this.parent = parent; 74 this.current = dateObj; 75 this.option = Object.assign ({}, OPTION, option); 76 init.call (this); 77 this.show (); 78 } 79 80 show () { 81 let 82 tbodies = [...this.table.tBodies], 83 tbody = this.parent.ownerDocument.createElement ('tbody'), 84 [ty, tm, td, tw] = getDTValue (this.current), 85 [cy, cm, cd, cw] = getDTValue (new Date (ty, tm + 1, 0)),//今月の月末 86 [py, pm, pd, pw] = getDTValue (new Date (ty, tm, 0)),//先月の月末 87 [ny, nm, nd] = getDTValue (), 88 f = (pw + 1) % 7, //1日の曜日 89 map = [ 90 ...Array.from (Array (f), (_, i) => pd - f + i + 1),//先月の日 91 ...Array.from (Array (cd), (_, i) => i + 1),//今月の日 92 ...Array.from (Array (6 - cw), (_, i) => i + 1)//翌月の日 93 ], 94 isToday = ny === ty && nm === tm ? nd + f -1: -1; 95 96 tbodies.forEach (removeChild); 97 this.table.caption.textContent = [cy, cm + 1].join (' / '); 98 99 for (let cnt = 0, m; map.length; ) { 100 m = map.splice (0, 7); 101 let tr = tbody.insertRow (-1); 102 for (let n of m) { 103 let td = tr.insertCell (-1); 104 td.textContent = n; 105 if (f > cnt || cnt >= (f + cd)) 106 td.classList.add ('is-disabled'); 107 else if (cnt == isToday) 108 td.classList.add ('today'); 109 cnt++; 110 } 111 } 112 113 this.table.appendChild (tbody); 114 return this; 115 } 116 117 118 next (n) { 119 addMonth (this.current, n); 120 return this.show (); 121 } 122 123 } 124 125 this.Calendar = Calendar; 126} 127 128//_________________________ 129 130const calendar = new Calendar (hoge); 131calendar.handleEvent = function (event) { 132 switch (event.target.id) { 133 case 'prev': this.next (-1); break; 134 case 'next': this.next (1); break; 135 } 136}; 137 138document.addEventListener ('click', calendar, false); 139 140//______________________________ 141//2つ目 142const calendar2 = new Calendar (fuga, new Date (2020, 7, 1)); 143calendar2.handleEvent = function (event) { 144 switch (event.target) { 145 case prev2: this.next (-1); break; 146 case next2: this.next (1); break; 147 } 148}; 149 150document.addEventListener ('click', calendar2, false); 151 152 153 154</script> 155

投稿2019/06/04 03:25

編集2019/06/04 06:13
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ntttt

2019/06/04 09:29

ご回答ありがとうございました。 こちらのコードはネットで見つけたものになります。 まだまだ一人ではカレンダーの作成すらできないので、ネットにあったコードのアレンジをしようとしていたところでした。 変数をできる限り少なくすることとappendChildはとても参考になりました。 hai_haiさんが作成したカレンダーのコードですが、 this.Calendar = Calendar;のコードでエラーになります。 エラー内容はCannot set property 'Calendar' of undefinedです。 どのようにしたら解決するでしょうか? 質問外のことですが、ご回答いただけると幸いです。
退会済みユーザー

退会済みユーザー

2019/06/04 09:38

ありえない。きっとコピペミス。ブラウザはなに?
ntttt

2019/06/04 11:07

ブラウザはクロームです。
退会済みユーザー

退会済みユーザー

2019/06/04 13:08

ちょろめでも動いてますよ。
miyabi_takatsuk

2019/06/05 01:23

あいかわらず、モダンでスマートな書き方で素晴らしいです! 今、ES6〜、猛勉強中なので、どうか参考にさせてください。 横槍失礼しました。
退会済みユーザー

退会済みユーザー

2019/06/05 06:54

お恥ずかしいかぎり・・・。
ntttt

2019/06/05 11:59

とても参考になるカレンダーのコードを教えて頂きありがとうございます。 私にはまだまだ理解できていないですが、こちらのコードを参考にjsの勉強を進めていきたいと思います。 本当にありがとうございました。
guest

0

javascript

1 2{ 3 const 4 WEEK_JP = ['日', '月', '火', '水', '木', '金', '土'], 5 WEEK_EN = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], 6 DATE_FN = ['getFullYear', 'getMonth', 'getDate', 'getDay']; 7 8 function addMonth (dt, n) { 9 dt.setMonth (dt.getMonth () + n); 10 } 11 12 function addDay (dt, n) { 13 dt.setDate (dt.getDate () + n); 14 } 15 16 function isSameDate (a, b) { 17 return DATE_FN.every (f => a[f]() === b[f]()); 18 } 19 20 function getDTValue (dt = new Date) { 21 return DATE_FN.map (f => dt[f]()); 22 } 23 24 //____________________ 25 26 function init (e) { 27 let 28 doc = e.ownerDocument, 29 tbl = doc.createElement ('table'), 30 cap = tbl.createCaption (), 31 thd = tbl.createTHead (), 32 tr = thd.insertRow (); 33 34 WEEK_JP.forEach (w => tr.insertCell ().textContent = w); 35 return e.appendChild (tbl); 36 } 37 38 //____________________ 39 40 class Calendar { 41 42 constructor (parent, dt = new Date) { 43 if (1 > arguments.length) 44 throw new Error ('引数が不足'); 45 46 this.table = init (parent); 47 this.parent = parent; 48 this.current = dt; 49 this.show (); 50 } 51 52 53 show () { 54 let 55 tbodies = this.table.tBodies, 56 tbody = this.parent.ownerDocument.createElement ('tbody'), 57 today = new Date,//今日 58 [Y, M] = getDTValue (this.current),//Classが持つ基準のDATE 59 current = new Date (Y, M + 1, 0),//月末 60 [cy, cm, cd, cw] = getDTValue (current),//月末の詳細 61 n0 = (7 + cw - cd % 7) % 7 + cd,//カレンダーに描く最初の日までの日数を求める 62 n1 = n0 + 7 - cw,//カレンダーに表示する日数を求める 63 holiday = new Map (Shukujitu.getHolidayList (Y, M).map (dt=> [dt.date.getDate (), dt]) || []), 64 tr, td; 65 66 Array.from (tbodies, e => e.remove ());//tbody 要素群をいったん削除 67 this.table.caption.textContent = [Y, M + 1].join (' / ');//caption要素に代入 68 69 addDay (current, -n0);//基準を最初の日にする 70 for (let i = 0; i < n1; i++) { 71 let 72 [, m, d, w] = getDTValue (current), 73 cname = [WEEK_EN[w]];//className 74 75 if (! w) 76 tr = tbody.insertRow (-1);//日曜なら行を作る 77 78 td = tr.insertCell (-1); 79 80 if (isSameDate (today, current)) 81 cname.push ('today'); 82 if (M != m) 83 cname.push ('disabled'); 84 else if (holiday.has (d)) { 85 cname.push ('holiday'); 86 td.title = holiday.get (d).name; 87 } 88 89 td.classList.add (...cname); 90 td.textContent = d; 91 td.dataset.date = [Y, M + 1, d].join ('-'); 92 93 addDay (current, 1);//inc 94 } 95 96 this.table.appendChild (tbody); 97 return this; 98 } 99 100 101 next (n) { 102 addMonth (this.current, n); 103 return this.show (); 104 } 105 106 } 107 108 this.Calendar = Calendar; 109} 110 111//_________________________ 112 113const calendar = new Calendar (hoge); 114calendar.handleEvent = function (event) { 115 switch (event.target.id) { 116 case 'prev': this.next (-1); break; 117 case 'next': this.next (1); break; 118 } 119}; 120 121document.addEventListener ('click', calendar, false); 122 123</script> 124

投稿2019/06/05 06:49

編集2019/06/05 21:31
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/05 06:53

これが3
guest

0

javascript

1 //_________________________________________________________________ 2 3 // 国民の祝日 「祝日法」 1948-7-20施行 4 //四方節 5 function sihousetu (y) {//法令で定められてはいない 6 return 1873 < y ? y <= 1948 ? { name: '四方節', date: new Date (y, 0, 1) }: null: null; 7 } 8 //新年宴会 9 function sinnenenkai (y) { 10 return 1873 < y ? { name: '新年宴会', date: new Date (y, 0, 5) }: null; 11 } 12 //紀元節 13 function kigensetu (y) { 14 return 1873 < y ? { name: '紀元節', date: new Date (y, 1, 11) }: null; 15 } 16 //天長節 17 function tentyousetu (y) { 18 let date; 19 switch (true) { 20 case y < 1874 : case y === 1912 : case 1948 < y : return null; break; 21 case y < 1912 : date = new Date (y, 10, 3); break; 22 case y < 1927 : date = new Date (y, 7, 31); break; 23 case y < 1949 : date = new Date (y, 3, 29); break; 24 default : throw new Error ('year = ' + y); break; 25 } 26 27 return { name: '天長節', date }; 28 } 29 //天長節祝日 30 function tentyousetu_shukujitu (y) { 31 return 1913 <= y ? y <= 1926 ? { name: '天長節祝日', date: new Date (y, 9, 31) }: null: null; 32 } 33 //明治節 34 function meijisetu (y) { 35 return 1927 <= y ? y < 1948 ? { name: '明治節', date: new Date (y, 10, 3) }: null: null; 36 } 37 38 //元始祭 39 function gensisai (y) { 40 return 1873 < y ? y <= 1948 ? { name: '元始祭', date: new Date (y, 0, 3) }: null: null; 41 } 42 //孝明天皇祭 43 function koumeitennousai (y) { 44 return 1873 < y ? y <= 1912 ? { name: '孝明天皇祭', date: new Date (y, 0, 30) }: null: null; 45 } 46 //春季皇霊祭 47 function shunkikoureisai (y) { 48 return 1879 <= y ? y <= 1948 ? { name: '春季皇霊祭', date: new Date (y, 2, 21) }: null: null; 49 } 50 //神武天皇祭 51 function jinmutennousai (y) { 52 return 1873 < y ? y <= 1948 ? { name: '神武天皇祭', date: new Date (y, 3, 3) }: null: null; 53 } 54 //明治天皇祭 55 function meijitennousai (y) { 56 return 1913 <= y ? y <= 1926 ? { name: '明治天皇祭', date: new Date (y, 6, 30) }: null: null; 57 } 58 //神嘗祭 59 function kannamesai (y) { 60 return 1873 <= y ? y <= 1878 ? { name: '神嘗祭', date: new Date (y, 8, 17) }: null: null; 61 } 62 //秋季皇霊祭 63 function shuukikoureisai (y) { 64 return 1878 <= y ? y < 1948 ? { name: '秋季皇霊祭', date: new Date (y, 8, 23) }: null: null; 65 } 66 //神嘗祭(2) 67 function kannamesai2 (y) { 68 return 1879 <= y ? y < 1948 ? { name: '神嘗祭', date: new Date (y, 9, 17) }: null: null; 69 } 70 //新嘗祭 71 function niinamesai (y) { 72 return 1873 <= y ? y < 1948 ? { name: '新嘗祭', date: new Date (y, 10, 23) }: null: null; 73 } 74 //大正天皇祭 75 function taishoutennousai (y) { 76 return 1927 <= y ? y < 1948 ? { name: '大正天皇祭', date: new Date (y, 11, 25) }: null: null; 77 } 78 79 80 //_________________________________________________________________ 81 82 //皇室慶弔行事 83 function kousitu_gyouji (y) { 84 switch (y) { 85 case 1915 : 86 return [ 87 {name: '即位の礼', date: new Date (y, 10, 10)}, 88 {name: '大嘗祭', date: new Date (y, 10, 14)}, 89 {name: '大饗第1日', date: new Date (y, 10, 16)} 90 ]; 91 break; 92 93 case 1928 : 94 return [ 95 {name: '即位の礼', date: new Date (y, 10, 10)}, 96 {name: '大嘗祭', date: new Date (y, 10, 14)}, 97 {name: '大饗第1日', date: new Date (y, 10, 16)} 98 ]; 99 break; 100 101 case 1959 : 102 return [{name: '皇太子・明仁親王の結婚の儀', date: new Date (y, 3, 10)}]; 103 break; 104 105 case 1989 : 106 return [{name: '昭和天皇の大喪の礼', date: new Date (y, 1, 24)}]; 107 break; 108 109 case 1990 : 110 return [{name: '即位の礼正殿の儀', date: new Date (y, 10, 12)}]; 111 break; 112 113 case 1993 : 114 return [{name: '皇太子・皇太子徳仁親王の結婚の儀', date: new Date (y, 5, 9)}]; 115 break; 116 117 case 2019 : 118 return [ 119 {name: '天皇の即位', date: new Date (y, 4, 1)}, 120 {name: '即位の礼正殿の儀', date: new Date (y, 9, 22)} 121 ]; 122 break; 123 124 default : 125 return [ ]; 126 } 127 } 128 129 130 //_________________________________________________________________ 131 132 class Shukujitu { 133 constructor (year = CURRENT_YEAR) { 134 this.year = year; 135 this.holidays = Shukujitu.getHolidayList (year); 136 } 137 138 139 //_____ 140 // arg0 = DateObject or Year(integer); 141 //arg1 = 0~11は月数、省略or -1 は、指定年のすべての祝日を返す 142 static getHolidayList (date = CURRENT_DATE, month = -1) { 143 if (! date instanceof Date) { 144 if (Number.isInteger (date)) 145 date = new Date (date, 0, 1); 146 else 147 throw new Error ('年数の値が範囲外'); 148 } 149 if (month < -1 || 12 < month) 150 throw new Error ('月数の値が範囲外'); 151 152 let 153 year = typeof date === 'object' ? date.getFullYear (): date, 154 holidays = [ ], furikae = [ ], kokumin = [ ], kousitu = [ ], shukujitu = [ ]; 155 156 SHUKUJITU_FUNC.forEach (func => { 157 let rst = func (year); 158 if (rst) 159 holidays.push (rst); 160 }); 161 162 holidays = holidays.sort (sortByDate); 163 kousitu = kousitu_gyouji (year);//皇室行事は祝日と重ならないのでこのまま混合する 164 furikae = furikaeKyuujitu (holidays); 165 shukujitu = holidays.concat (kousitu).sort (sortByDate); 166 kokumin = kokuminKyuujitu (shukujitu); 167 168 holidays = addYMDmethod (shukujitu.concat (furikae, kokumin).sort (sortByDate)); 169 if (-1 < month) 170 holidays = holidays.filter (dt => month === dt.date.getMonth ()); 171 172 return holidays; 173 } 174 } 175 176 //_____ 177 178 this.Shukujitu = Shukujitu; 179} 180 181 182//________________________________________________________ 183

投稿2019/06/05 06:48

編集2019/06/05 21:29
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/05 06:52

これが2
guest

0

祝日に対応してみました。

長くなったので分割します。

html

1<!DOCTYPE html> 2<html lang="ja"> 3<meta charset="utf-8"> 4<title></title> 5<style> 6td { 7 text-align: center; 8} 9tr td:first-Of-type { 10 color: red; 11} 12tr td:nth-Of-type(7) { 13 color: blue; 14} 15td.disabled { 16 color: silver !important; 17} 18td.today { 19 border-bottom: 2px solid green; 20 background: rgba(255,255,0,.3); 21} 22td.holiday { 23 background: rgba(255,0,0,.1); 24 color: red; 25} 26 27</style> 28<body> 29 <div id="hoge"></div> 30 <input type="button" value="prev" id="prev"> 31 <input type="button" value="next" id="next"> 32 33<script> 34 35{ 36 const 37 CURRENT_DATE = new Date, 38 CURRENT_YEAR = CURRENT_DATE.getFullYear (), 39 TITLE_FURIKAE = '(振替休日)', 40 TITLE_KOKUMIN = '(国民の休日)', 41 42 SHUKUJITU_FUNC = [ 43 // 国民の祝日 「祝日法」 1948-7-20施行 44 ganjitu, // 元日 45 seijin_no_hi, // 成人の日 46 kenkokukinen_no_hi, // 建国記念の日 47 shunbun_no_hi, // 春分の日 48 shouwa_tennou, // 昭和の日、みどりの日、昭和天皇誕生日 49 kenpou_kinenbi, // 憲法記念日 50 midori_no_hi, // みどりの日 51 kodomo_no_hi, // こどもの日 52 umi_no_hi, // 海の日 53 yama_no_hi, // 山の日 54 keirou_no_hi, // 敬老の日 55 shuubun_no_hi, // 秋分の日 56 taiiku_no_hi, // 体育の日 57 bunka_no_hi, // 文化の日 58 kinroukansha_no_hi, // 勤労感謝の日 59 heisei_tennou, //(平成)天皇誕生日 60 61 // 祝祭日 「年中祭日祝日ノ休暇日ヲ定ム」 1873-10-14施行 62 sihousetu, //四方節 - 63 sinnenenkai, //新年宴会 64 kigensetu, //紀元節 65 tentyousetu, //天長節 66 tentyousetu_shukujitu, //天長節祝日 67 meijisetu, //明治節 68 69 gensisai, //元始祭 70 koumeitennousai, //孝明天皇祭 71 shunkikoureisai, //春季皇霊祭 72 jinmutennousai, //神武天皇祭 73 meijitennousai, //明治天皇祭 74 kannamesai, //神嘗祭 75 shuukikoureisai, //秋季皇霊祭 76 kannamesai2, //神嘗祭 77 niinamesai, //新嘗祭 78 taishoutennousai //大正天皇祭 79 ]; 80 81 //_________________________________________________________________ 82 83 //指定の年月のn週のw曜日の日にちを返す 84 function getWN (year, month, week_num, day_num) { 85 let 86 d = new Date (year, month, 1), 87 td = day_num - d.getDay () + 1; 88 if (td <= 0) 89 td += 7; 90 td += 7 * (week_num - 1); 91 92 return td; 93 } 94 95 //日付順にソート用 96 function sortByDate (a, b) { 97 return a.date > b.date; 98 } 99 100 //次の日にする 101 function nextDate (d = new Date, n = 1) { 102 d.setDate (d.getDate () + n); 103 return d; 104 } 105 106 //日付が等しいか 107 function isSameDate (a, b) { 108 let rst = 109 (!a) || (!b) || 110 (a.getFullYear () !== b.getFullYear ()) || 111 (a.getMonth () !== b.getMonth ()) || 112 (a.getDate () !== b.getDate ()); 113 return !rst; 114 } 115 116 //年月日の属性を付加する 117 function addYMDmethod (list) { 118 for (let rec of list) { 119 let d = rec.date; 120 rec.year = d.getFullYear (); 121 rec.month = d.getMonth () + 1; 122 rec.day = d.getDate (); 123 } 124 return list; 125 } 126 127 function ymd (dt = new Date) { 128 return dt ? ['getFullYear', 'getMonth', 'getDate'].map (fn => dt[fn]()).join ('-'): null; 129 } 130 131 132 //_________________________________________________________________ 133 134 //元日 135 function ganjitu (y) { 136 return 1948 < y ? {name: '元日', date: new Date (y, 0, 1)}: null; 137 } 138 //成人の日 139 function seijin_no_hi (y) { 140 return 1948 < y ? {name: '成人の日', date: new Date (y, 0, y < 2000 ? 15: getWN (y, 0, 2, 1))}: null; 141 } 142 //建国記念の日 143 function kenkokukinen_no_hi (y) { 144 return 1948 < y ? { name: '建国記念の日', date: new Date (y, 1, 11)}: null; 145 } 146 //春分の日 147 function shunbun_no_hi (y) { 148 if (y <= 1948) return null; 149 let d; 150 151 if (y < 1980) 152 d = parseInt(20.8357 + 0.242194 * ( y - 1980), 10) - parseInt((y - 1983) / 4, 10); 153 else if (y < 2100) 154 d = parseInt(20.8431 + 0.242194 * ( y - 1980), 10) - parseInt((y - 1980) / 4, 10); 155 else if (y < 2150) 156 d = parseInt(20.8510 + 0.242194 * ( y - 1980), 10) - parseInt((y - 1980) / 4, 10); 157 else 158 throw new Error ('範囲外です' + y); 159 160 return { name: '春分の日', date: new Date (y, 2, d) }; 161 } 162 //天皇誕生日, みどりの日, 昭和の日 163 function shouwa_tennou (y) { 164 return 1948 < y ? {name: y < 1989 ? '天皇誕生日': y < 2007 ? 'みどりの日': '昭和の日', date: new Date (y, 3, 29)}: null; 165 } 166 //憲法記念日 167 function kenpou_kinenbi (y) { 168 return 1948 < y ? { name: '憲法記念日', date: new Date (y, 4, 3)}: null; 169 } 170 //みどりの日 171 function midori_no_hi (y) { 172 return 2006 < y ? { name: 'みどりの日', date: new Date (y, 4, 4)}: null; 173 } 174 //こどもの日 175 function kodomo_no_hi (y) { 176 return 1949 < y ? { name: 'こどもの日', date: new Date (y, 4, 5)}: null; 177 } 178 //海の日 179 function umi_no_hi (y) { 180 return 1995 < y ? { name: '海の日', date: new Date (y, 6, 2002 < y ? getWN (y, 6, 3, 1): 20 )}: null; 181 } 182 //山の日 183 function yama_no_hi (y) { 184 return 2015 < y ? {name: '山の日', date: new Date (y, 7, 11)}: null; 185 } 186 //敬老の日 187 function keirou_no_hi (y) { 188 return 1965 < y ? {name: '敬老の日', date: new Date (y, 8, y < 2003 ? 15: getWN (y, 8, 3, 1))}: null; 189 } 190 //秋分の日 191 function shuubun_no_hi (y) { 192 if (y < 1948) return null; //法の施行後 193 194 let d; 195 if (y < 1980) 196 d = parseInt(23.2588 + 0.242194 * (y - 1980), 10) - parseInt((y - 1983) / 4, 10); 197 else if (y < 2100) 198 d = parseInt(23.2488 + 0.242194 * (y - 1980), 10) - parseInt((y - 1980) / 4, 10); 199 else if (y < 2150) 200 d = parseInt(24.2488 + 0.242194 * (y - 1980), 10) - parseInt((y - 1980) / 4, 10); 201 else 202 throw new Error ('範囲外です'); 203 204 return { name: '秋分の日', date: new Date (y, 8, d)}; 205 } 206 //体育の日 207 function taiiku_no_hi (y) { 208 return 1965 < y ? {name: '体育の日', date: new Date (y, 9, y < 2000 ? 10: getWN (y, 9, 2, 1))}: null; 209 } 210 //文化の日 211 function bunka_no_hi (y) { 212 return 1947 < y ? {name: '文化の日', date: new Date (y, 10, 3)}: null; 213 } 214 //勤労感謝の日 215 function kinroukansha_no_hi (y) { 216 return 1947 < y ? {name: '勤労感謝の日', date:new Date (y, 10, 23)}: null; 217 } 218 //天皇誕生日 219 function heisei_tennou (y) { 220 return 1988 < y ? y < 2019 ? { name: '天皇誕生日', date: new Date (y, 11, 23)}: null: null; 221 } 222 //振替休日 223 function furikaeKyuujitu (list = [ ]) { 224 let 225 furikae = [ ], 226 prev = null; 227 begin = +new Date (1973, 3, 12), //.getTime (); 228 end = +new Date (2007, 0, 1); //.getTime () --> 2006/12/31:23:59:59:999? 229 230 list.forEach (obj => { 231 if (+obj.date < begin) return;//1973以前は振替休日がない 232 233 let date = new Date (obj.date); 234 235 //2006/12/31以前:国民の祝日が日曜のとき次の日は振替休日 236 if (+date < end) { 237 if (0 === date.getDay ())//日曜 238 furikae.push ({name: TITLE_FURIKAE, date: nextDate (date)}); 239 } 240 //2007以降、国民の祝日が連続しており、その中に日曜が含まれるとき次の平日は振替休日 241 else { 242 if (prev) { 243 if (isSameDate (prev, date)) 244 nextDate (prev); 245 else { 246 furikae.push ({name: TITLE_FURIKAE, date: prev}); 247 prev = null; 248 } 249 } 250 if (0 === date.getDay ()) 251 prev = nextDate (date); 252 } 253 }); 254 255 return furikae; 256 } 257 258 //国民の休日 259 function kokuminKyuujitu (list = [ ]) { 260 if (! list.length) 261 throw new Error (''); 262 263 let 264 kyuujitu = [ ], 265 y = list[0].date.getFullYear ();//祝日の配列の最初のDATEを基準とする 266 prv = null, 267 begin = new Date (1985, 11, 27); 268 269 //1986-2006の5月4日の特殊処理 270 if (1986 <= y && y <= 2006) 271 kyuujitu.push ({ name: TITLE_KOKUMIN, date: new Date (y, 4, 4)}); 272 273 //1985/12/27以降 274 for (let cur of list) { 275 let date = new Date (cur.date); 276 if (begin <= +date) { 277 if (isSameDate (prv, date)) { 278 kyuujitu.push ({name: TITLE_KOKUMIN, date: nextDate (prv, -1)}); 279 } 280 prv = nextDate (date, 2); 281 } 282 } 283 return kyuujitu; 284 } 285

投稿2019/06/05 06:47

編集2019/06/05 21:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/05 06:52

ごめんなさい。作ってたら長くなって分割投稿になりました。 って、文字制限があったのかよ~!1万文字なんて少なすぎだろう? 見直せよ! 祝日は、正しい結果を返すのか検証していません。
guest

0

まずは、コメント内もしくは変数名以外に全角文字を使うのはやめましょう。
一応、全角文字が許可されている言語ですが、不必要な箇所で使うと、思わぬエラーの原因になります。
(一行コメントの前に大量の全角スペースがありました)
そして、コードを書くときは、サンプルの場合でも、記法は正しくした方が、回答しやすいものとなり、よろしいかと。
(JavaScriptでは、**コメント**の形式はコメントアウトになりません)

さて、回答です。
みたところ、原因は、
dayCount < today

endDayCount > today
の条件が通っていないからと思われます。
dayCount++と、today++が実行されてないわけですね。
ifの条件式は、基本的に上から順番に条件を見ていき、マッチする条件以降は参照しません。
現状だと、dayCount == todayで処理がストップし、
endDayCount > todayが通らないので、
today++が実行されず、だからです。
そして、今回のやることとしては、todayはあくまで不動でなければ、そもそもの前提が崩れる条件式となっているため、
正しくカレンダーにはなりません。
よって、下記のような、条件式が正解となるでしょう。

javascript

1for(let d = 0; d < 7; d++) { 2 if(w == 0 && d < startDay) { 3 //lastMonthendDayCountは先月の末日の数値 4 //startDayは今月の最初の日の曜日の数値 5 let num = lastMonthendDayCount - startDay + d + 1; 6 7 calendarHtml += `<td class = "is-disabled">${num}</td>`; 8 } else if(dayCount > endDayCount) { 9 //dayCountは1 10 //endDayCountは今月の末日の数値 11 let num = dayCount - endDayCount; 12 13 calendarHtml += `<td class="is-disabled">${num}</td>`; 14 dayCount ++; 15 //todayは今月の末日の数値 16 } else if(dayCount < today) { 17 calendarHtml += `<td class="calendar_td" data- 18 date="${year}/${month}/${dayCount}">${dayCount}</td>`; 19 dayCount ++; 20 } else if(dayCount == today) { 21 calendarHtml += `<td class="calendar_td today" data-date="${year}/${month}/${dayCount}">${dayCount}</td>`; 22 // ここでも、dayCountをプラスしないと、日付は当然進まない。 23 dayCount ++; 24 } else if(endDayCount > today) { 25 // 下のあくまで、dayCountを表示という考えのもと、文字列表示も、dayCountを使う 26 calendarHtml += `<td class="calendar_td" data-date="${year}/${month}/${dayCount}">${dayCount}</td>`; 27 // あくまで、プラスするのは、dayCountにする。todayはあくまで、今日としないと、上の条件式の前提が崩れる 28 dayCount ++; 29 } 30}

それと、hai_haiさんがおっしゃる通り、今回原因の特定が困難になったのは、コードの書き方にも原因があるかとおもいますので、簡潔に書くように、必要な処理を整理して書くようにすると、バグも見つけやすいコードになっていくと思います。
(今回私の書いたコードは、質問者さんのまま、変えております。
ただし、月末日が、金曜日であっても、最後の週が追加されてしまっています。
↑今回の質問の要件ではないため、スルーしてます。)

投稿2019/06/04 04:23

miyabi_takatsuk

総合スコア9528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ntttt

2019/06/04 09:22

ご回答ありがとうございました。 miyabi_takatsukさんのご説明がとても分かりやすかったので、実行されない原因が理解できました。 原因だけではなく、jsのルールを教えて頂きありがとうございました。
miyabi_takatsuk

2019/06/04 13:50 編集

もし解決したのであれば、ベストアンサーを選出して、質問を閉じましょう。 あと、質問修正依頼も、ご覧いただき、質問文を修正しましょう。 次質問される時に活きてくるはずですので。また、この質問を他の、同じことで悩んでいる誰かの解決の糸口にもなるかもしれませんので、解決後でも、質問修正は大事かと思います。
ntttt

2019/06/05 11:46

質問修正依頼を見落としてました。 かしこまりました。質問修正して、ベストアンサーを決めて質問を終了させていただきます。 色々と教えて頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問