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

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

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

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

2回答

501閲覧

指定した年月日から入力された年月日までの経過日数を表示したいです

mimino2525

総合スコア1

JavaScript

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2021/06/22 03:35

編集2021/06/22 23:49

前提・実現したいこと

1986年5月29日から入力された年月日までの経過日数を表示するプログラムを書いています。
また、過去日が入力された場合の処理と日時以外が表示された場合の処理も作りたいのですが、
下記のコードでのif文if (year > 1986 || (month >= 5 || day >= 29))で上手く弾けずマイナスで表示されてしまいます。日時以外の処理のif文であるif (isNaN(year) == false || isNaN(month) == false || isNaN(day) == false)では何も入力しないと過去日として判定されてしまうのでこの2点を解決したいです。

該当のソースコード

JavaScript
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> </head> <body> <script> <!-- var date = new Date(1986, 5, 29); var year = prompt('年を入力してください'); var month = prompt('月を入力してください'); var day = prompt('日を入力してください'); if (isNaN(year) == false || isNaN(month) == false || isNaN(day) == false) { if (year > 1986 || (month >= 5 || day >= 29)) { var date1 = new Date(year, month, day); date.setMonth(date.getMonth() - 1); var mm = date1.getTime() - date.getTime(); var day1 = (mm / (1000 * 60 * 60 * 24)) - 31; console.log(day1 + '日経過しています'); } else { console.log("入力された日付が過去日です") } } else { console.log("年月日を入力してください"); } --> </script> </body> </html>
修正後

int32_tさんのアドバイスを参考にコードを修正し大分形になりましたが、
年月日全て入力しないとしっかり何も入力されていない処理がされるのですが
最初に年数を入力した後に月や日付を入力しないと過去日として扱われてしまいます。
解決方法があれば教えてください。

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> </head> <body> <script> <!-- var date = new Date(1986, 5, 29); var year = prompt('年を入力してください'); var month = prompt('月を入力してください'); var day = prompt('日を入力してください'); if (isNaN(parseInt(year)) == false || isNaN(parseInt(month)) == false || isNaN(parseInt(day)) == false) { if (year > 1986 || year == 1986 && month > 5 || year == 1986 && month == 5 && day >= 29) { var date1 = new Date(year, month, day); date.setMonth(date.getMonth() - 1); var mm = date1.getTime() - date.getTime(); var day1 = (mm / (1000 * 60 * 60 * 24)) - 31; console.log(day1 + '日経過しています'); } else { console.log("入力された日付が過去日です") } } else { console.log("年月日を入力してください"); } --> </script>

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

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

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

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

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

guest

回答2

0

if (year > 1986 || (month >= 5 || day >= 29)) {

yearが1900でも、monthが5以上なら通ってしまいますよね。このアプローチでチェックするなら、「yearが1986より大きい、またはyearが1986でmonthが5より大きい、またはyearが1986でmonthが5でdayが29以上」を条件にする必要があります。

これは面倒なので、new Date(year, month - 1, day) してから変数dateと比較すると簡単です。

if (isNaN(year) == false || isNaN(month) == false || isNaN(day) == false) {

空文字列はNaNではないので、この条件は通ってしまいますね。!isNaN(parseInt(year)) && !isNan(... でしょうか。

投稿2021/06/22 04:05

int32_t

総合スコア21008

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

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

0

投稿2021/06/22 03:46

y_waiwai

総合スコア87800

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

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

mimino2525

2021/06/22 23:45

ありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問