1. トップ
  2. 新着ニュース
  3. IT
  4. IT総合

PowerShellで任意の日付を計算する

ASCII.jp / 2022年10月2日 10時0分

 コンピュータの前にずっと座っていると、ときどき時間の感覚が鈍くなって、「はて、今日は何日だったか」なんて考えることがある。今ではPCで簡単に時刻やカレンダーを見ることができる。端末からコンピューターを使っていた時代なら、日付やカレンダーを表示するコマンドがあった。

 単純に今の日付や時刻、カレンダーがわかっても、たとえば「160日後に失効します」なんて通知が表示されたとき、その日を計算するのは面倒だ。Windowsの電卓には、「日付の計算」があるが、スタートメニューを開いて、電卓を起動、切り替えて数値を入力というのも手間である。コンピューターなんだから、日付の計算ぐらい簡単に済ませたい。

Windows 10/11標準の電卓には日数計算の機能はあるが、「2つの日付の差」と「日付の加算、減算」しか計算できない

 この連載の今年最初の記事(「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

で表示できる。

get-dateは標準では、曜日を表示しないが「設定」→「時刻と言語」→「言語と地域」→「地域設定」にある「日付(長い形式)」の書式を変更することで曜日を表示できるようになる。また、レジストリを操作すると、より細かく書式の設定が可能

 たとえば、「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)

と言った具合だ。

get-dateで得られる日付は変数に保存しておくとあとの処理がしやすい。日付の計算は、AddDaysやAddMonthなどのメソッドを使う

 引き算では負数を指定する。

$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を足せば、月曜から土曜の日付を得られる。

DayOfWeekプロパティは曜日を表しInt型にキャストすると0~6の数値になる。これを日付から引くと、必ず週の始まりとなる日曜日になる。これに1~6を加算することで曜日を指定した日時が得られる

 Get-Dateコマンドが出力するdatetimeオブジェクトには、以下の表のようなプロパティがある。

 get-dateで任意の日付指定をする方法がわかれば、あとは、AddDaysやAddMonthといったメソッドを使って増減することで日付計算は簡単にできるというわけだ。

この記事に関連するニュース

トピックスRSS

ランキング

記事ミッション中・・・

10秒滞在

記事にリアクションする

記事ミッション中・・・

10秒滞在

記事にリアクションする

デイリー: 参加する
ウィークリー: 参加する
マンスリー: 参加する
10秒滞在

記事にリアクションする

次の記事を探す

エラーが発生しました

ページを再読み込みして
ください