PowerShellで任意の日付を計算する
ASCII.jp / 2022年10月2日 10時0分
コンピュータの前にずっと座っていると、ときどき時間の感覚が鈍くなって、「はて、今日は何日だったか」なんて考えることがある。今ではPCで簡単に時刻やカレンダーを見ることができる。端末からコンピューターを使っていた時代なら、日付やカレンダーを表示するコマンドがあった。
単純に今の日付や時刻、カレンダーがわかっても、たとえば「160日後に失効します」なんて通知が表示されたとき、その日を計算するのは面倒だ。Windowsの電卓には、「日付の計算」があるが、スタートメニューを開いて、電卓を起動、切り替えて数値を入力というのも手間である。コンピューターなんだから、日付の計算ぐらい簡単に済ませたい。
この連載の今年最初の記事(「PowerShellでWindowsが起動してからの時間を計算する」)で、Windowsの起動時間をPowerShellで計算する方法を紹介したが、日付に関してはきちんと説明してなかった。そこで今回は、Get-Dateコマンドと日付の計算をする方法を解説する。
コマンドラインで日付を得る
cmd.exeには、日付の計算機能が標準では備わっていないので、ここではWindows PowerShellを使う(PowerShellでも同じ)。まずは今日の日付だが、これは「Get-Date」コマンドで表示できる。なお、Get-Dateは、Dateと略すことも可能だ(ただし、Date.exeなどがPathに存在しない場合)。
Get-Dateだけを実行すると、現在の日時が表示されるが、これは、「設定」→「時刻と言語」→「言語と地域」→「地域設定」にある「日付(長い形式)」による表示。設定を変更すれば、他の形式でも可能だ。
この形式、以前のWindowsでは、書式指定文字で指定できたのだが、現在はいくつかのパターンから選ぶようになっている。長くはなるが、できれば曜日も表示させたい。パターンから選んでもいいが、書式指定がわかるなら、レジストリで好みのパターンに変更できる。現在設定されている「日付(長い形式)」は、
get-ItemProperty 'HKCU:\Control Panel\International\' slongDate
で表示できる。
たとえば、「2022年10月2日 10時00分 日曜日」のようなパターンにしたいのであれば、
Set-ItemProperty 'HKCU:\Control Panel\international' -name sLongDate -Value "yyyy'年'MM'月'dd'日 'dddd"
とする。これでget-dateを実行すると、曜日が表示されるようになる(PowerShellは再起動が必要)。
以後の解説では、この形式であることを前提にしている。なお、一部のアプリケーションは、日付文字列が長すぎると表示がおかしくなったり、落ちてしまうというヒドイ作りになっていることがある。変更はご自身のリスクで実行してほしい。
なお、英語表記でもよければ、前記のレジストリ設定を行わなくても「get-date -Format 'r'」で、RFC1123形式が出力され、先頭に曜日がある。
get-dateコマンドの「-Format」オプションには、日付書式文字を指定できる。これは、.NET Frameworkと同じで、標準では下の表のような表示パターンが指定できる。
なお、細かく書式を指定するときには「カスタム日時指定文字列」を使う。これについては、以下に解説がある。
●カスタム日時形式文字列 https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/custom-date-and-time-format-strings
続いては任意の日付を得る
get-dateは、そのままでは現在日時を返すが、特定の日時を指定したいこともあるだろう。たとえば、「2022年1月1日」を指定する場合、簡単な方法として、
get-date '2022/1/1'
とする。シングルクオートの中の書式は意外に自由が利く。たとえば'2022年1月1日'でもいいし、'1 Jan 2022'でもいい。1月1日なら実は'2022年'だけでもよいが'2022'ではエラーになる。文字列の場合、省略された部分があるとき、月や日付なら1が、時刻なら0が仮定される。
もう1つは、get-dateのオプションを指定する方法がある。get-dateには表のような日付、時刻指定のオプションがあり、これで日時を指定できる。
なお、矛盾がなければ、文字列による日時指定とオプションによる日時指定は混在できる。たとえば、「2022年8月1日」の午前3時は、
get-date '2022/8/1' -Hour 3
と指定できる。
日時を加減算する
get-dateは、.NET Frameworkのdatetimeオブジェクトを出力する。このdatetimeには、表のような加減算が可能なメソッドがある。
これらを使うことで、160日後、18ヵ月後といった日付を計算できる。こうした計算をする場合、get-dateコマンドをカッコで囲む必要がある。これは繰り返し計算するときにも面倒なので、一回変数に入れてしまう。
$d=get-date
とする。この場合、たとえば、「2022年10月1日」の150日後なら、
$d=get-date '2022/10/1' $d.AddDays(150)
と言った具合だ。
引き算では負数を指定する。
$d.AddDays(-30)
で「2022年10月1日」の30日前の日付が得られる。
日付計算に関するTips
日付の計算では月末の日付が欲しいときがある。その場合は、省略したオプションを使う。get-dateでは、指定を省略したオプションでは、現在日時の指定が使われる。逆に言えば、日付指定では、現在日時が基準で、-monthや-dayオプションや文字列による日時指定は、現在日時の該当部分のみを書き換えると考えてもいい。
そうすると、「get-date -day 1」は、今年の今月の月初(1日)が得られる。今月末の日付がほしいなら、翌月1日の前日の日付を求めればよい。これならうるう年について何も考える必要がなく計算ができる。
(get-date -day 1).AddMonths(1).AddDays(-1)
“DayOfWeek”プロパティは、曜日を返す。ただし、英語である。結果を“[int]”でキャストすると、曜日に応じた0~6の整数値が得られる(0が日曜日)。
[int](get-date '2022/3/1').DayOfWeek
これを利用すると、2022年3月1日のある週の日曜日は
$d=get-date '2022/3/1' $d.AddDays(-[int]$d.DayOfWeek)
となり、ここに1~6を足せば、月曜から土曜の日付を得られる。
Get-Dateコマンドが出力するdatetimeオブジェクトには、以下の表のようなプロパティがある。
get-dateで任意の日付指定をする方法がわかれば、あとは、AddDaysやAddMonthといったメソッドを使って増減することで日付計算は簡単にできるというわけだ。
この記事に関連するニュース
-
窓辺の小石 第191回 リンクの冒険
マイナビニュース / 2024年11月8日 17時3分
-
Excelをノーコードで自動化しよう! パワークエリの教科書 第26回 「条件列」を使った区分用データの作成
マイナビニュース / 2024年11月5日 11時0分
-
あらためてIPv6基本のキ
ASCII.jp / 2024年11月3日 10時0分
-
Excelをノーコードで自動化しよう! パワークエリの教科書 第25回 データの途中に文字を挿入する方法
マイナビニュース / 2024年10月28日 11時0分
-
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法
ASCII.jp / 2024年10月27日 10時0分
ランキング
-
1【最新】Wi-Fiルーターだけはいいものを買え、今ならこれでキマリだ
ASCII.jp / 2024年11月23日 17時0分
-
2Switchで遊べるヴァンサバ系ゲーム5選!強化しまくって大量の敵を一掃する「俺TUEEE!」が超気持ちいい
インサイド / 2024年11月23日 15時0分
-
3普段は塩対応の柴犬に大好きな人が会いに来たら……? 別犬のような喜び方が270万再生を突破「お散歩ってワードにも、それで頼む」
ねとらぼ / 2024年11月23日 7時0分
-
4プロが教える「PCをオフにする時はシャットダウンとスリープ、どっちがいいの?」 理想の選択肢は意外にも…… 「有益な情報ありがとう」「感動しました
ねとらぼ / 2024年11月20日 22時0分
-
5「しぬwww」「怖すぎ」 かわいいカメを“絵文字ミックス”したら…… 爆誕した“バケモノ”が2200万表示 衝撃ビジュアルに「笑いすぎて涙」
ねとらぼ / 2024年11月23日 20時20分
記事ミッション中・・・
記事にリアクションする
記事ミッション中・・・
記事にリアクションする
エラーが発生しました
ページを再読み込みして
ください