質問するログイン新規登録
JavaScript

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

jQuery

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

Q&A

解決済

2回答

1261閲覧

JavaScriptで年数の加算が上手くいかない

emma.

総合スコア26

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2022/02/14 08:34

0

0

前提・実現したいこと

フォームAに契約日、フォームBに契約期間を入力すると、フォームCに契約終了日(1日前)が出てくるようにしたいです。

例:
フォームA→ 2021/2/1
フォームB→ 1 (年)
フォームC→ 2022/1/31

又同時に、フォームBが3か月や半年だった時、0.3や0.6と入力して結果を出したいのですが反応しません。
できればそちらも実現したいと考えております。

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

1日前にしたいので、date1.getDate() -1とマイナスしたところ、2月0日という様に月初のみ月をまたぐことができません。

該当のソースコード

html

1<div class="form form07"> 2 <label for="agreement_start" class="form_name">契約開始日</label> 3 <input id="agreement_start" type="date" name="agreement_start" class="form07_date"> 4</div> 5 6<div class="form form08"> 7 <label for="agreement_kikan" class="form_name" >契約期間</label> 8 <input id="agreement_kikan" type="number" name="agreement_kikan" placeholder="半角数字"> 9</div> 10 11<div class="form"> 12 <label for="agreement_end" class="form_name">契約終了日</label> 13<input id="agreement_end" type="text" name="agreement_end"/> 14</div>

js

1jQuery(function($) { 2 jQuery(document).on('blur', '#agreement_start, #agreement_kikan', function(){ 3 var date1 = document.getElementById("agreement_start").value; 4 var days = document.getElementById("agreement_kikan").value; 5 var date2 = addDate(date1, days); 6 jQuery("#agreement_end").val(date2); 7 }); 8}); 9 10/* 11 *日付の差分日数を返却します。 12 */ 13function addDate(date1Str, days) { 14 var date1 = new Date(date1Str); 15 16 // パラメータで取得した日数を加算 17 date1.setFullYear(date1.getFullYear() + Number(days)); 18 19 // Date型を(YYYY/MM/DD)形式へ成型して返却 20 return [date1.getFullYear() , date1.getMonth() + 1, date1.getDate() - 1].join('/'); 21}

補足情報(FW/ツールのバージョンなど)

こちらのサイト様のコードを参考に記述しております。
jsはまだ勉強中のため、わからない事の方が多いのですがどうかお知恵を貸していただきたいです。
補足が必要でしたら教えていただけますと幸いです。どうかよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

1年足す処理で date1.setFullYear(... + Number(days)) とやってますから、1日引く処理でも同様に date1.setDate(... - 1) としましょう。

0.3や0.6と入力して結果を出したい

setFullYear() に少数を足した値を渡しても動かないと思いますので、0.6 や 0.3 の場合は setMonth() で月数を足すように分岐しましょう。

投稿2022/02/14 08:44

int32_t

総合スコア21952

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

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

emma.

2022/02/14 09:40

ありがとうございます。 date1.setDate(date1.getDate() - 1 ) で1日引くのは上手くできました。 月数の分岐はif文でできるかと思い、上記処理の後に下記を記述してみたのですが反応しません。 宜しければ今一度アドバイスを頂けますと幸いです。 if (days < 1){ function addDate(date1Str, days){ var date1 = new Date(date1Str); date1.setMonth(date1.getMonth() + Number(days)* 10); return [date1.getFullYear() , date1.getMonth() + 1, date1.getDate()].join('/'); }}
int32_t

2022/02/14 15:28 編集

もし「1が1年、0.6が半年、0.3が3ヶ月」という仕様だとdaysから1つの式で月数を計算することはできないので、1かそれ以外かで判定するために条件分岐が必要という意図でした。 if (days == "1") date1.setFullYear(... + Number(days)); else date1.setMonth( ... + Number(days) * 10); という感じです。 「1が1年、0.5が半年、0.25が3ヶ月」や「1.2が1年、0.6が半年、0.3が3ヶ月」という仕様なら条件分岐なしでできます。
emma.

2022/02/14 15:21

ご丁寧に教えていただき本当にありがとうございます。 下記で無事実装することができました。 ただ1点、0.5や0.8にすると日付のマイナス1がなくなってしまうようなのですが、他の数字ではきちんと-1された月末が表示されるため、何かPC上の問題なのか?と思っています。 function addDate(date1Str, days) { var date1 = new Date(date1Str); // パラメータで取得した日数を加算 date1.setDate(date1.getDate() - 1 ) if (days == "1") date1.setFullYear(date1.getFullYear() + Number(days)); else date1.setMonth(date1.getMonth() + Number(days) * 10); // Date型を(YYYY/MM/DD)形式へ成型して返却 return [date1.getFullYear() , date1.getMonth() + 1, date1.getDate()].join('/'); }
int32_t

2022/02/14 15:31

> 0.5や0.8にすると日付のマイナス1がなくなってしまう 具体的な入力と結果が不明なのではっきりしたことはわかりませんが、setDate() を setFullYear() setMonth() より後に行うと直るかもしれませんね。
emma.

2022/02/15 00:46

setDate() を後ろにしたら直りました! 何から何まで本当にありがとうございます。 とても勉強になりました。
guest

0

JavaScriptで直接Dateオブジェクト触るのも良いですが、面倒なのとミスやバグの可能性を増やしてしまうので、日付操作ライブラリを使用するのもひとつの手です。

以前はmoment.jsというのが主流でしたが、開発が今後行われないことが決定したため、代替としてDay.jsなどが用いられます。

https://day.js.org/

投稿2022/02/14 08:39

Eskee

総合スコア268

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

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

emma.

2022/02/14 11:04

まだまだ初心者なので、日付操作ライブラリというものも初めて知りました。 今後の為に勉強していきたいと思います。 教えていただき誠にありがとございます。
Eskee

2022/02/14 11:07

直接日付を捜査すること自体は間違いではありません。 ライブラリの利用も、リクエスト数やアセット容量の増加というデメリットもあるので、ケースバイケースで使い分けれるといいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問