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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

2132閲覧

JavaScript:日付の妥当性のチェック

chaton

総合スコア15

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/01/28 10:14

前提・実現したいこと

課題で社員情報登録のフォームを作成しており、
生年月日の入力チェックで存在しない日付を弾きたいです。(閏年も含む)

発生している問題・エラーメッセージ

入力形式のチェックまではできているのですが、知識不足で日付のチェックのやり方が分からず困っております。 ご教示いただけると助かります。

該当のソースコード

javaScript

1 // 入力内容チェックのための関数 2 function input_check(){ 3 var result = true; 4 5 // エラー用装飾のためのクラスリセット 6 $('#emp_pass').removeClass("inp_error"); 7 $('#emp_name').removeClass("inp_error"); 8 $('#address').removeClass("inp_error"); 9 $('#birthday').removeClass("inp_error"); 10 11 12 // 入力エラー文をリセット 13 $("#emp_pass_error").empty(); 14 $("#emp_name_error").empty(); 15 $("#address_error").empty(); 16 $("#birthday_error").empty(); 17 18 // 入力内容セット 19 var emp_pass = $("#emp_pass").val(); 20 var emp_name = $("#emp_name").val(); 21 var address = $("#address").val(); 22 var birthday = $("#birthday").val(); 23 24 // 入力内容チェック 25 26 // パスワード 27 if(emp_pass == ""){ 28 $("#emp_pass_error").html("* パスワードを入力してください。"); 29 $("#emp_pass").addClass("inp_error"); 30 result = false; 31 }else if(emp_pass.length > 16){ 32 $("#emp_pass_error").html("* パスワードは16文字以内で入力してください。"); 33 $("#emp_pass").addClass("inp_error"); 34 result = false; 35 } 36 // 社員名 37 if(emp_name == ""){ 38 $("#emp_name_error").html("* 社員名を入力してください。"); 39 $("#emp_name").addClass("inp_error"); 40 result = false; 41 }else if(emp_name.length > 30){ 42 $("#emp_name_error").html("* 社員名は30文字以内で入力してください。"); 43 $("#emp_name").addClass("inp_error"); 44 result = false; 45 } 46 47 // 住所 48 if(address == ""){ 49 $("#address_error").html("* 住所を入力してください。"); 50 $("#address").addClass("inp_error"); 51 result = false; 52 }else if(address.length > 60){ 53 $("#address_error").html("* 住所は60文字以内で入力してください。"); 54 $("#address").addClass("inp_error"); 55 result = false; 56 } 57 58 // 生年月日 59 if(birthday == ""){ 60 $("#birthday_error").html("* 生年月日を入力してください。"); 61 $("#birthday").addClass("inp_error"); 62 result = false; 63 }else if(!birthday.match(/^\d{4}/\d{1,2}/\d{1,2}$/)){ 64 $("#birthday_error").html("* 正しい日付を入力してください。"); 65 $("#birthday").addClass("inp_error"); 66 result = false; 67 } 68 69 return result; 70}

html

1<form action="<%=request.getContextPath()%>/RegistCheck" 2 method="post" onsubmit="return input_check();" class="regist_input"> 3 <table class="emp_form"> 4 <tr> 5 <th class="label">パスワード:</th> 6 <td class="input"><input type="password" id="emp_pass" 7 name="emp_pass"><br /><span id="emp_pass_error" 8 class="error_m"></span></td> 9 </tr> 10 <tr> 11 <th class="label">社員名:</th> 12 <td class="input"><input type="text" id="emp_name" 13 name="emp_name"><br /><span id="emp_name_error" 14 class="error_m"></span></td> 15 </tr> 16 <tr> 17 <th class="label">性別:</th> 18 <td class="input"><label><input type="radio" 19 name="gender" value="1" checked="checked" />男性</label>&emsp;<label><input 20 type="radio" name="gender" value="2" />女性</label></td> 21 </tr> 22 <tr> 23 <th class="label">住所:</th> 24 <td class="input"><input type="text" id="address" 25 name="address"><br /><span id="address_error" class="error_m"></span> 26 </td> 27 </tr> 28 <tr> 29 <th class="label">生年月日:</th> 30 <td class="input"><input type="text" id="birthday" 31 name="birthday"> 32 <br /><span id="birthday_error" 33 class="error_m"></span></td> 34 </tr> 35 <tr> 36 <th class="label">権限:</th> 37 <td class="input"><label><input type="radio" 38 name="authority" value="1" checked="checked" />一般</label>&emsp;<label><input 39 type="radio" name="authority" value="2" />管理者</label></td> 40 </tr> 41 <tr> 42 <th class="label">部署名:</th> 43 <td class="input"><select name="dept_id"> 44 <option value="1">営業部</option> 45 <option value="2">経理部</option> 46 <option value="3">総務部</option> 47 </select></td> 48 </tr> 49 </table> 50 <input type="submit" value="登録"/> 51 </form>

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

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

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

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

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

guest

回答4

0

意外とこのチェックが難しいねんな…
このように明らかにおかしい値を入力しても、「25時って言えば、明日の1時だよね」みたいな解釈をされます。

JavaScript

1> new Date(2018, 2, 35) 2Wed Apr 04 2018 00:00:00 GMT+0900 (日本標準時)

文字列から作る場合もnew Date(文字列)の実装はブラウザ毎にまちまちな挙動であり、PHPのようによしなにやってくれるわけではありません。

Moment.jsというライブラリなら
Validationという日付が妥当か否かをチェックする機能が存在します。
これを使えば一撃なので検討してみてくださいね。

導入方法はブラウザの項目を見ながらcdn配布のスクリプトを読み込むだけです。

投稿2019/01/28 10:20

miyabi-sun

総合スコア21158

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

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

0

JavaScript

1}else if(!birthday.match(/^\d{4}/\d{1,2}/\d{1,2}$/)){

正規表現は次の数値範囲を表すように修正するとして、

  • 年 = 1桁以上(上限なし)
  • 月 = 1-12
  • 日 = 1-31

new Date を通した後の数値」と「元の数値」を比較すれば、良いでしょう。

JavaScript

1var date = new Date(yyyy, mm, dd); 2 3if (date.getFullYear() === yyyy && date.getMonth() + 1 === mm && date.getDate() === dd) { 4 console.log('valid'); 5}

Re: chaton さん

投稿2019/01/28 10:57

編集2019/01/28 10:59
think49

総合スコア18164

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

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

0

javascript

1 2let str = '2400-2-29'; 3let reg = /^(?:(?!(?:[02468][1235679]|[13579][01345789])00[年\-/]0?2[月/\-](?:29|30)日?))(?:(?![0-9]{2}(?:[02468][1235679]|[13579][01345789])[年\-/]0?2[月/\-](?:29|30)日?))(?:(?![0-9]{4}[年\-/](?:0?2|0?4|0?6|0?9|11)[月/\-]31日?))([0-9]{4})[年\-/](0?[1-9]|1[0-2])[月/\-](0?[1-9]|[12][0-9]|3[01])日?$/; 4let n; 5 6let date = (n = reg.exec(str)) ? new Date (n[1], n[2]-1, n[3]): null; 7console.log(date); 8 9

投稿2019/01/28 10:32

編集2019/01/28 10:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

いくつか決めないといけない仕様があります

  • セパレータはどこまで許すか?(/のみ?-OK?年月日など漢字OK?)
  • 0フィルをどこまで許すか?(一桁の頭に0をつける?0001的なのもOK?)

たとえば「1999/1/1」のバリエーション

  • 1999-1-1:ハイフン
  • 1999-01-01:0フィル
  • 1999-01-1:月か日のどちらかだけ0フィル
  • 1999-1/1:ハイフンとスラッシュの併用
  • 1999-001-012:2つ以上0フィルや2桁数字の0フィル

総じてnew Dateしてy,m,dを抜き出してその数値で正規表現するのがラクでしょう

javascript

1["1999/01/01","1999-1-1","1999-12-32","1999-12-0"].forEach((birthday)=>{ 2 var b=new Date(birthday); 3 var y=b.getFullYear(); 4 var m=b.getMonth()+1; 5 var d=b.getDate(); 6 var reg=new RegExp("^"+y+"([/-])0?"+m+"(?:\1)0?"+d); 7 console.log(birthday+":"+(birthday.match(reg)?"ok":"ng")); 8});

あとは条件次第

追記

セパレータは/のみで、1992/01/01という形式のみ許可

という条件で

javascript

1<script> 2window.addEventListener('DOMContentLoaded', function(e){ 3 document.querySelector('[name=birthday]').addEventListener('change',function(e){ 4 var v=e.target.value; 5 var b=new Date(v); 6 var y=b.getFullYear(); 7 var m=b.getMonth()+1; 8 var d=b.getDate(); 9 var reg=new RegExp("^"+y+"/"+(m+100).toString().substr(-2)+"/"+(d+100).toString().substr(-2)+"$"); 10 document.querySelector('#birthday_err').textContent=(v=="" || v.match(reg))?"":"err"; 11 }); 12}); 13</script> 14<input type="text" name="birthday" pattern="\d{4}/\d{2}/\d{2}" placeholder="YYYY/MM/DD" size="10" required> <span id="birthday_err"></span>

投稿2019/01/29 00:46

編集2019/01/29 02:07
yambejp

総合スコア114843

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

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

chaton

2019/01/29 01:51

ご回答ありがとうございます。 セパレータは/のみで、1992/01/01という形式のみ許可するようにしたいですm(__)m
yambejp

2019/01/29 02:07

条件を合わせました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問