DateTimeを使って特定の時刻を表す
これに対して、特定の時刻を表すには、DateTimeオブジェクトを使う。DateTimeも.NET Frameworkのオブジェクトである。
●DateTime
https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime?view=netframework-4.8
PowerShellでは、Get-DateコマンドなどがDateTimeオブジェクトを返す。Windowsが起動した時刻は、Get-CimInstanceコマンドを使い、
(Get-CimInstance Win32_OperatingSystem).LastBootUpTime
で得られる。これもDateTimeオブジェクトだ。
そのため、現在時刻を表すGet-Dateから再起動した時刻を引けば、経過時間を得ることができる。なお、Get-CimInstanceはgcimというエイリアスが標準で定義されている。
(Get-Date) - (gcim Win32_OperatingSystem).LastBootUpTime
上記の引き算の左右はともにDateTimeオブジェクト(時刻)なので、その結果はTimeSpan(時間)になる。先頭のGet-Dateにカッコが必要なのは、Get-Dateの値をここで計算させるためだ。これがないと後続の部分が式ではなくGet-Dateコマンドの引数とみなされてエラーになってしまう。このあたりがPowerShellのわかりにくく面倒なところだろう。
同様に現在時刻から、再起動後の経過時間を引けば、起動時刻を求めることができる。この結果は時刻なのでDateTimeである。
(Get-Date) - [TimeSpan][int64](1E4*[Environment]::TickCount)
ただし、上記の計算結果は、記録された時間である“LastBootUpTime”とは数秒の誤差がある。というのも、TickCountはシステムタイマーの割り込みを使ってソフトウェアで合算していくもので、ミリ秒単位の誤差を含むからだ。もっともWindowsが起動した時間や経過時間を秒単位で確定することはあまりないので概算値でも問題はないだろう。
Unix/Linux形式の時刻表現を変換する
Windowsのアプリケーションでも、一部のプログラムはUnix/Linux形式の時刻表現を使う。Unix/Linuxでは、協定世界時(UTC)で1970年1月1日午前0時0分0秒を起点とした秒数で時刻を表す。これはUnix時間などと呼ばれ、起点となる時刻をUnix Epocという。Linuxのdateコマンドを使うと、現在時刻をUnix時間で表示できる。
date +'%s'
Unix時間は2023年11月14日までは、上位2桁が16の10桁の数値である。このことを知っていると、データ中のUnix時間にアタリをつけることができる。Excelなどで読み込んだファイルの日付データを見たら、「1640962800」のような数字だった場合、Unix時間を使っている可能性が高い。
これをDateTimeに直すには、Unix時間からTimeSpanを作り、Unix Epocに加算してやればよい。Unix EpocはUTCなので、get-dateの引数にUTCの時刻オフセット「+0000」を付ける。時刻は省略すると「0時0分0秒」が仮定されるので省略可能だ。
(get-date -Date '1970/1/1 +0000') + [TimeSpan][Int64](1E7*1640962800)
とする。
整数値からTimeSpanへの変換は結構頻度が高い。なので関数を定義しておくといい。
function global:I2TS($v) {
return [TimeSpan][Int64](Invoke-Expression $v) }
上記の式なら“(get-date -Date '1970/1/1 +0000') + (I2TS 1E7*1640962800)”と書ける(加算記号の両側をカッコでくくる点に注意)。
起動からの経過時間をGUIで見るだけでいいというのであれば、タスクマネージャーのパフォーマンスタブにあるCPUに「稼働時間」というのがある。また、コマンドラインで表示するだけでよいのであれば、systeminfo.exeコマンドがある。とはいえ、PCを使ううえで時間を計算したくなることはある。そんなときにDateTimeとTimeSpanを使ってみるといいだろう。
この連載の記事
-
第428回
PC
Google/Bingで使える検索オプション -
第427回
PC
WindowsのPowerShellのプロファイルを設定する -
第426回
PC
WindowsでAndroidスマホをWebカメラにする機能を試した -
第425回
PC
無料で使えるExcelにWord、Microsoft 365のウェブ版を調べた -
第424回
PC
Windowsの基本機能であるクリップボードについてあらためて整理 -
第423回
PC
PowerShellの今を見る 2つあるPowerShellはどっち使えばいい? -
第422回
PC
Windows 11の目玉機能が早くも終了、Windows Subsystem for Android(WSA)を振り返る -
第421回
PC
進化しているPowerToys LANで接続したマシンでキーボード/マウス共有機能などが追加 -
第420回
PC
Windowsプレビュー版に搭載されたsudoを試す -
第419回
PC
Windows Insider Previewが変わって、今秋登場のWindows 11 Ver.24H2の新機能が見えてきた? -
第418回
PC
Windows 11のスマートフォン連携は新機能が追加されるなど、いまだ進化している - この連載の一覧へ