日付オブジェクトのプロパティ

Get-Dateコマンドレットで取得できる日付のオブジェクト(System.DateTime)には、主に次のプロパティが設定されている。

プロパティ名 内容
Date 年月日時分秒など
Day
DayOfWeek 曜日
DayOfYear 1年で何日目か
Hour
Kind UTCやLocalなど
Millisecond ミリ秒
Minute
Month
Second
Ticks 基準日付から100ナノ秒単位での刻み値
TimeOfDay 時分秒など
Year

日付オブジェクトから個々の値を取り出す場合にはこうしたプロパティが利用できる。

日付オブジェクトのプロパティにアクセスした場合のサンプル

PS /Users/daichi> $d = Get-date
PS /Users/daichi> $d.Day
26
PS /Users/daichi> $d.DayOfWeek
Tuesday
PS /Users/daichi> $d.DayOfYear
177
PS /Users/daichi> $d.Hour
15
PS /Users/daichi> $d.Millisecond
966
PS /Users/daichi> $d.Minute
10
PS /Users/daichi> $d.Month
6
PS /Users/daichi> $d.Second
57
PS /Users/daichi> $d.Year
2018
PS /Users/daichi>

Get-Dateコマンドレットで取得できるオブジェクトはSystem.DateTimeという型のオブジェクトだ。PowerShellはシェルスクリプトのように利用できるが、実際にはオブジェクト指向プログラミング言語の機能を備えており、やり取りされているデータはテキストデータではなくオブジェクトになっている。

このあたりは細かく説明してもよくわからなくなってくると思うので、今後いろいろ取りあげる動作例を通じてなんとなく感覚を掴んでいってもらえればと思う。

日付オブジェクトのメソッド

Get-Dateコマンドレットで取得できるオブジェクトはSystem.DateTime型だ。この型には主に次のようなメソッドが用意されている。加算や減算、ほかの型への変換機能などが用意されている。

メソッド 内容
Add timespan値を加算
AddDays 日を加算
AddHours 時を加算
AddMilliseconds ミリ秒を加算
AddMinutes 分を加算
AddMonths 月を加算
AddSeconds 秒を加算
AddTicks チックを加算
AddYears 年を加算
CompareTo 比較
Equals 等価演算
GetDateTimeFormats 指定可能なフォーマット一覧を表示
GetHashCode ハッシュコード取得
GetType 型情報を取得
GetTypeCode タイプコードを取得
IsDaylightSavingTime 夏時間かどうか
Subtract 引き算
ToFileTime ファイルタイム(long)に変更
ToFileTimeUtc ファイルタイム(long, UTC)に変換
ToLocalTime ローカルタイムに変換
ToLongDateString 日付文字列(長い)に変換
ToLongTimeString 時刻文字列(長い)に変換
ToShortDateString 日付文字列(短い)に変換
ToShortTimeString 時刻文字列(短い)に変換
ToString 指定したフォーマットの文字列に変換
ToUniversalTime UTC時間に変換

たとえば、addDays()メソッドを使って日付データを1週間増やすとすれば、次のように操作すればよいことになる。

日付を1週間進める場合の操作例

PS /Users/daichi> $d

Tuesday, 26 June 2018 15:10:57


PS /Users/daichi> $d.addDays(7)

Tuesday, 3 July 2018 15:10:57


PS /Users/daichi>

次に、日付がある一定の期間内にあるかどうかを判断する場合を考える。判断するにあたって先にPowerShell Coreで利用できる論理演算子と比較演算子を知っておく必要があるので、次にまとめておく。

論理演算子 意味
-and 論理積
-or 論理和
-xor 排他的論理和
-not 否定
! 否定
比較演算子 意味
-eq 等価
-ne 等価ではない
-gt 大なり
-ge 大なりイコール
-lt 小なり
-le 小なりイコール
-like ワイルドカードマッチ
-notlike ワイルドカードマッチしない
-match 正規表現マッチ
-notmatch 正規表現マッチしない
-contains コレクションに参照値が含まれている
-notcontains コレクションに参照値が含まれていない
-in コレクションにテスト値が含まれている
-notin コレクションにテスト値が含まれていない
-replace 文字列パターンを置換
-is オブジェクトが同じ型
-isnot オブジェクトが同じ型ではない

JavaやC/C++、Pythonといったプログラミング言語に慣れているなら&&、||、!、<、<=、>、>=などの演算子を知っていると思うが、上記演算子はそれと似たような働きをする。UNIX系コマンドのtestでは上記のようにハイフンからはじまる論理演算子や比較演算子を利用するのだが、それとよく似ている。

こうした機能を使って日付データを比較すると次のようになる。

日付演算の例

PS /Users/daichi> $start=(Get-Date -Format yyyy/MM/dd 2018/01/01)
PS /Users/daichi> $end=(Get-Date -Format yyyy/MM/dd 2018/01/10)
PS /Users/daichi> $a=(Get-Date -Format yyyy/MM/dd 2017/12/30)
PS /Users/daichi> $b=(Get-Date -Format yyyy/MM/dd 2018/01/03)
PS /Users/daichi> $c=(Get-Date -Format yyyy/MM/dd 2018/02/03)
PS /Users/daichi> $start
2018/01/01
PS /Users/daichi> $end
2018/01/10
PS /Users/daichi> $a
2017/12/30
PS /Users/daichi> $b
2018/01/03
PS /Users/daichi> $c
2018/02/03
PS /Users/daichi> ($start -le $a) -and ($a -le $end)
False
PS /Users/daichi> ($start -le $b) -and ($b -le $end)
True
PS /Users/daichi> ($start -le $c) -and ($c -le $end)
False
PS /Users/daichi>

$startと$endの間に収まっている日付データだけがTrueと判断されていることを確認できことがわかる。こんな感じで日付の演算が可能というわけだ。

まだコマンドの使い方に留まっているのでプログラミング的なサンプルは掲載しないが、制御構文を使えばログデータを解析して指定した期間内のログデータだけを取り出すといったこともできるようになる。そのあたりまでできるようになれば入門の範囲では上出来だ。

参考資料