Get-Dateコマンドレット
現在時刻を取得するコマンドレットにGet-Dateがある。日付の取得や、日付データの加工はスクリプトを作成する際にもよく利用する機能だ。PowerShell Coreでは日付をただの文字列としてではなく日付データとして柔軟に利用できる。
例えばログデータを作成する場合には日付データは必須といえるし、ファイル名に日付や時刻を含めるという作業もよくやることだ。
Get-Dateコマンドレットを使うことでこうした日付データを取得することができる。まずはこの基本的なコマンドレットの使い方を身につけてしまおう。
現在時刻を取得
Get-Dateコマンドレットを引数なしで実行すると次のように現在時刻に基づく日時データが表示される。
現在時刻を取得
PS /Users/daichi> Get-Date
2018年6月20日 水曜日 17:05:05
PS /Users/daichi>
これがGet-Dateコマンドレットの基本的な使い方だ。
出力形式を指定
日付データを利用する場合、大抵は必要になるフォーマットに則った形で出力する必要がある。Get-Dateコマンドレットにはこの目的で-Formatおよび-UFormatというオプションが用意されている。
-FormatはWindows形式での日付フォーマットの指定、-UFormatはUNIX dateコマンド形式での日付フォーマットの指定となる。
-FormatでWindows形式の日付フォーマット指定をおこなった場合
PS /Users/daichi> Get-Date -Format "yyyy年MM月dd日 dddd HH時mm分ss秒 zz"
2018年06月20日 水曜日 17時45分11秒 +09
PS /Users/daichi>
-UFormatでUNIX dateコマンド形式の日付フォーマット指定をおこなった場合
PS /Users/daichi> Get-Date -UFormat "%Y年%m月%d日 %A %H時%M分%S秒 %Z"
2018年06月20日 水曜日 17時47分50秒 +09
PS /Users/daichi>
-Formatおよび-UFormatで指定できる主なフォーマットをまとめると次のようになる。
-Format | -UFormat | 意味 |
---|---|---|
yyyy | %G | 年(4桁) |
yy | %g | 年(下2桁) |
MM | %m | 月(数字) |
MMM | %bまたは%h | 月(短縮表記) |
MMMM | %B | 月(対象ロケールでの表記) |
dd | %d | 日 |
HH | %H | 時(24時間表記) |
hh | %I | 時(12時間表記) |
mm | %M | 分 |
ss | %S | 秒 |
tt | %p | 午前または午後 |
dddd | %A | 曜日 |
ddd | %a | 曜日(短縮表記) |
zz | %Z | タイムゾーン |
慣れている方を使えばよいだろう。LinuxやmacOS、Windowsが混在した環境を使っているなら、-UFormatを覚えておくとmacOS/Linuxでも応用が効くようになるのでよいかもしれない。
実は、これらのオプションで指定できるフォーマットはもっとたくさんある。詳しく知りたい場合は、GetDateCommand.csのソースコードを見てほしい。執筆段階では332行目あたりからのコードを読むと、-Formatと-UFormatの相互関係がよくわかるだろう。
指定した日時で表示
日付データを出力するケースでは、現在時刻ではなく指定した日時で日付データを出力したいということがよくある。Get-Dateコマンドレットでは引数に日付を書いて渡すと、その文字列を日付データとして解析してデータを生成し、表示してくれる。
指定した日時で日付データを出力
PS /Users/daichi> Get-Date 2018/01/01
2018年1月1日 月曜日 0:00:00
PS /Users/daichi> Get-Date "2018/01/01 08:10:30"
2018年1月1日 月曜日 8:10:30
PS /Users/daichi>
指定できるフォーマットはロケール毎に異なるが、日本でよく使われている表記を真似て指定すれば大抵は問題なく通るだろう。
日付の足し算や引き算、日付データの演算など
LinuxやmacOSではdateコマンドで似たようなことができるが、あくまでも文字列が出力されるだけなので、文字列としてデータを扱う必要がある。しかし、PowerShell Coreは一見するとUNIXのシェルスクリプトのようだが、プログラミング言語としての側面を備えており、日付データを演算することができる。
詳しくは次回以降で取りあげるが、たとえば次のように現在時刻から2週間後、または2週間前といった指定でデータを作成することができる。
日付データの加算と減算
PS /Users/daichi> Get-Date
2018年6月20日 水曜日 17:56:31
PS /Users/daichi> (Get-Date).AddDays(14)
2018年7月4日 水曜日 17:56:44
PS /Users/daichi> (Get-Date).AddDays(-14)
2018年6月6日 水曜日 17:57:10
PS /Users/daichi>
日付データを変数に代入してから、次のように演算することもできる。
日付データを変数に代入してから演算
PS /Users/daichi> $start = (Get-Date).AddDays(-14)
PS /Users/daichi> $end = Get-Date
PS /Users/daichi> $start - $end
Days : -14
Hours : 0
Minutes : 0
Seconds : -15
Milliseconds : -665
Ticks : -12096156654360
TotalDays : -14.0001813129167
TotalHours : -336.00435151
TotalMinutes : -20160.2610906
TotalSeconds : -1209615.665436
TotalMilliseconds : -1209615665.436
PS /Users/daichi> $end - $start
Days : 14
Hours : 0
Minutes : 0
Seconds : 15
Milliseconds : 665
Ticks : 12096156654360
TotalDays : 14.0001813129167
TotalHours : 336.00435151
TotalMinutes : 20160.2610906
TotalSeconds : 1209615.665436
TotalMilliseconds : 1209615665.436
PS /Users/daichi>
Get-Dateの出力をパイプラインでGet-Memberに接続すると、次のような出力を得ることができる。Get-Dateで出力されるデータをさまざまな方法で操作できることがわかる。
DateTimeのメソッドとプロパティ
PS /Users/daichi> Get-Date | Get-Member
TypeName: System.DateTime
Name MemberType Definition
---- ---------- ----------
Add Method datetime Add(timespan value)
AddDays Method datetime AddDays(double value)
AddHours Method datetime AddHours(double value)
AddMilliseconds Method datetime AddMilliseconds(double value)
AddMinutes Method datetime AddMinutes(double value)
AddMonths Method datetime AddMonths(int months)
AddSeconds Method datetime AddSeconds(double value)
AddTicks Method datetime AddTicks(long value)
AddYears Method datetime AddYears(int value)
CompareTo Method int CompareTo(System.Object value), int CompareTo(datetime value), int...
Equals Method bool Equals(System.Object value), bool Equals(datetime value), bool IE...
GetDateTimeFormats Method string[] GetDateTimeFormats(), string[] GetDateTimeFormats(System.IFor...
GetHashCode Method int GetHashCode()
GetObjectData Method void ISerializable.GetObjectData(System.Runtime.Serialization.Serializ...
GetType Method type GetType()
GetTypeCode Method System.TypeCode GetTypeCode(), System.TypeCode IConvertible.GetTypeCode()
IsDaylightSavingTime Method bool IsDaylightSavingTime()
Subtract Method timespan Subtract(datetime value), datetime Subtract(timespan value)
ToBinary Method long ToBinary()
ToBoolean Method bool IConvertible.ToBoolean(System.IFormatProvider provider)
ToByte Method byte IConvertible.ToByte(System.IFormatProvider provider)
ToChar Method char IConvertible.ToChar(System.IFormatProvider provider)
ToDateTime Method datetime IConvertible.ToDateTime(System.IFormatProvider provider)
ToDecimal Method decimal IConvertible.ToDecimal(System.IFormatProvider provider)
ToDouble Method double IConvertible.ToDouble(System.IFormatProvider provider)
ToFileTime Method long ToFileTime()
ToFileTimeUtc Method long ToFileTimeUtc()
ToInt16 Method int16 IConvertible.ToInt16(System.IFormatProvider provider)
ToInt32 Method int IConvertible.ToInt32(System.IFormatProvider provider)
ToInt64 Method long IConvertible.ToInt64(System.IFormatProvider provider)
ToLocalTime Method datetime ToLocalTime()
ToLongDateString Method string ToLongDateString()
ToLongTimeString Method string ToLongTimeString()
ToOADate Method double ToOADate()
ToSByte Method sbyte IConvertible.ToSByte(System.IFormatProvider provider)
ToShortDateString Method string ToShortDateString()
ToShortTimeString Method string ToShortTimeString()
ToSingle Method float IConvertible.ToSingle(System.IFormatProvider provider)
ToString Method string ToString(), string ToString(string format), string ToString(Sys...
ToType Method System.Object IConvertible.ToType(type conversionType, System.IFormatP...
ToUInt16 Method uint16 IConvertible.ToUInt16(System.IFormatProvider provider)
ToUInt32 Method uint32 IConvertible.ToUInt32(System.IFormatProvider provider)
ToUInt64 Method uint64 IConvertible.ToUInt64(System.IFormatProvider provider)
ToUniversalTime Method datetime ToUniversalTime()
DisplayHint NoteProperty DisplayHintType DisplayHint=DateTime
Date Property datetime Date {get;}
Day Property int Day {get;}
DayOfWeek Property System.DayOfWeek DayOfWeek {get;}
DayOfYear Property int DayOfYear {get;}
Hour Property int Hour {get;}
Kind Property System.DateTimeKind Kind {get;}
Millisecond Property int Millisecond {get;}
Minute Property int Minute {get;}
Month Property int Month {get;}
Second Property int Second {get;}
Ticks Property long Ticks {get;}
TimeOfDay Property timespan TimeOfDay {get;}
Year Property int Year {get;}
DateTime ScriptProperty System.Object DateTime {get=if ((& { Set-StrictMode -Version 1; $this....
PS /Users/daichi>
Get-Dateで取得できるデータはそれだけでさまざまな加工が可能だ。プログラミング言語を学ぶつもりはないが、日付データの処理をちょいちょいっと自動化したい方もいるだろう。そういったニーズにもPowerShell Coreは応えてくれるので便利だ。
参考資料
- Microsoft PowerShell Module Browser
- Microsoft PowerShell6|Object Pipeline
- Microsoft PowerShell6|Understanding the Windows PowerShell Pipeline
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Get-Date
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Get-Member
- PowerShell/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetDateCommand.cs