【Javascript】月の加算・減算は月末に注意【Date()】
前回の記事
でDateオブジェクトの関数を利用した日付の減算を行いました。
// 現在から3ヶ月前にセット
date.setMonth(date.getMonth() - 3);
ここで、一つ疑問が湧きました。
「5月30日の1ヶ月前は4月30日だけど、5月31日はの1ヶ月前は何月何日になるのか?」
4月31日は存在しないので、月末の4月30日になるのでしょうか?
実際に試すことのできるプログラムを作成しました。
※日付入力欄はyyyy-mm-dd形式で入力します。存在しない日付はエラーになります。
※使用ブラウザがchromeやfirefoxの場合カレンダーが表示され、日付を選択できます。
月の引き算を行うサンプル
ヶ月前は...
です。
結果
実行結果を見てみると、5月31日の1ヶ月前は5月1日になります。
4月31日=4月30日+1日 → 5月1日ということでしょう。
同様に、5月31日の3ヶ月前は
2月31日=2月28日+3日 → 3月3日となります。(閏年でない場合)
ソースコード
最後にソースコードを貼っておきます。
html部分
<dev style="line-height: 200%;"> <input type="date" id="inputDate"> の<br> <input type="number" id="subMonth" value="3" max="99" min="0" style="width: 3em"> ヶ月前は...<br> <input type="button" value="計算する" onclick="calcDate();"> <p> <div id="outputDate"></div> です。 </p> </dev>
<script> var nowDate = new Date(); var yyyy = nowDate.getFullYear(); var mm = ("0"+(nowDate.getMonth()+1)).slice(-2); var dd = ("0"+nowDate.getDate()).slice(-2); // 日付入力欄の初期値をセット(今日の日付) var inputElem = document.getElementById("inputDate"); inputElem.value=yyyy+'-'+mm+'-'+dd; // 結果の初期値をセット calcDate(); // 日付の引き算をして、表示する関数 function calcDate(){ var outputElem = document.getElementById("outputDate"); var outputDate = new Date(inputElem.value); var subMonth = document.getElementById("subMonth").value; // 入力した月を減算 outputDate.setMonth(outputDate.getMonth() - subMonth); // yyyy/mm/dd 形式で表示 outputElem.innerText = outputDate.toLocaleDateString(); }; </script>
今回は以上です。
【C#, JS】 今年度を取得する
今年度を求めるプログラムを作りたいと思います。
今年度とは、今年4月から来年の3月までのことを言います。
求める方法は色々あると思いますが、C#やJavascriptのような日付のクラスや関数が用意されている言語であれば、次の方法が簡単だと思います。
年度 = 今月の3ヶ月前の年
例えば、2018年3月31日の3ヶ月前は2017年12月31日なので「2017年度」、2018年4月1日の3ヶ月前は2018年1月1日なので「2018年度」となります。
int Nendo = (DateTime.Today.AddMonths(-3)).Year;
Javascriptでも方法は同じです。
<script> var date = new Date(); document.write(date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日は、"); // 現在から3ヶ月前にセット date.setMonth(date.getMonth() - 3); // 今年度を表示 document.write(date.getFullYear()); </script>
Javascriptのソースコードを、ページの一番下に埋め込んでいます。
今日の日付と、今年度が表示されていると思います。
↓↓↓
↑↑↑
以上です。
【C#】「ファイルを選択」ダイアログでフォルダを選択する
C#で作るWindowsフォームアプリで、フォルダを選択することがあると思います。
標準のフォルダ選択クラスとして、FolderBrowserDialogが用意されていますが、フォルダパスの見通しが悪い上、パスのコピペができず、使い勝手が悪いです。
OpenFileDialogの画面でフォルダを選択可能なクラス「CommonOpenFileDialog」の使用方法を調べたので、手順をメモします。
使用するソリューションをVisual Studioで開く。
ソリューションエクスプローラーからソリューションかプロジェクトを右クリック→「NuGetパッケージの管理」を選択。
参照タブで、「windowsapicodepack」を検索。
「WindowsAPICodePack-Shell」をインストール。(複数ありますが、作成者:Aybeさんのものを選びました。)
追加したパッケージのusingをソースコードに入力。
using Microsoft.WindowsAPICodePack.Dialogs;
フォルダ選択画面を表示するコードを入力。
var dialog = new CommonOpenFileDialog("フォルダ選択"); // フォルダ選択モード dialog.IsFolderPicker = true; if (dialog.ShowDialog() == CommonFileDialogResult.Ok) { // フォルダ選択後の処理 }
以上の手順で、下画像のようなフォルダ選択画面を実現できます。
【Excel】行番号を自動で割り振る関数
Excelで行番号をつける際、行の挿入や削除があっても値の変更をする必要が無いよう、以下のような関数を使用していました。
- 1行目:値として「1」を入力。
- 2行目以降:=OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())), -1, 0)+1
この関数は、「自身のセルの1つ上のセルの値に+1する」という処理を行っています。2行目以降はすべて同じ内容で良いので便利です。
しかし、弱点もあり、下画像のように、間に空行があると番号が振り直されてしまいます。
A6の値を「=OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())), -2, 0)+1」にすれば一応解決しますが、空行が有るたびセルの値を変えるのは大変ですし、先ほどの「2行目以降はすべて同じ内容で良い」というメリットが消えてしまいます。
この弱点を解消する関数が以下のブロクで紹介されています。
http://knjname.hateblo.jp/entry/2014/03/23/134053
=MAX(INDIRECT(ADDRESS(1,COLUMN())&":"&ADDRESS(ROW()-1,COLUMN())))+1
この関数は、「今のセルより上の方の最大の番号+1を今のセルに与える」という処理を行っています。
先ほどのエクセルシートの二行目以降を、この関数に置き換えます。
- 1行目:値として「1」を入力。
- 2行目以降:=MAX(INDIRECT(ADDRESS(1,COLUMN())&":"&ADDRESS(ROW()-1,COLUMN())))+1
この関数だと、間に空行があっても大丈夫です。