ぶろとよ

ネットワーク系クラウドエンジニア(AWS)の技術ブログ。自動化に興味があるためAWS CLIを勉強&アウトプット中。

PowerShell: コマンドでJST(現在/指定時刻)からUST世界標準時に変換する

AWS CLIでコマンドを作っていると、UTCやJSTのタイムゾーンが混じってて泣くことがあります。。。
毎回毎回、JSTからUTCへの変換を電卓やWebサイトを使って行っていたのですが、、、流石に効率が悪いので、PowerShellでの変換方法を調べてみました。

目次

検証環境

  • 検証日: 2022/06/25
  • PC環境:
    • Windows10 Home Ver21H1
      • PowerShell: Ver7.1.5
      • AWS CLI: aws-cli/2.1.34 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
        • -- profile default : 読み取り専用
        • -- profile aws_RW : 書き込み権限あり
          • ※ 誤操作防止のため、変更操作時のみ-- profileオプション付与。
        • -- profile aws_PF : SystemsManagerポートフォワーディング用

注意事項

  • 本記事の内容はWindows PowerShellで検証しています。
  • AWS CLIはバージョン2を使用しています。
    • 本記事のコマンド出力でYAMLを使用してますが、これはバージョン2の機能です。
  • コマンド内の変数やパラメータやは検証で使用したものを記載しています。ご自身の環境に合わせ、書き換えて使用してください。
  • 個人で検証しているため実行結果に責任は持てません。必ずご自身でも検証してから使用してください。


1. PCのタイムゾーンを確認する

僕は日本在住なので、タイムゾーンは東京(JST, GMT+9)です。

Get-TimeZone

## 出力例
PS C:\Users\blotoyo> Get-TimeZone

Id                         : Tokyo Standard Time
DisplayName                : (UTC+09:00) 大阪、札幌、東京
StandardName               : 東京 (標準時)
DaylightName               : 東京 (夏時間)
BaseUtcOffset              : 09:00:00
SupportsDaylightSavingTime : False


2. JST(現在時刻)をUTCで出力する

2.1. 現在時刻をUTCに変換して出力する

  • Get-Dateコマンドレット: 日付・時刻情報を取得する
  • ToUniversalTimeメソッド: Get-Dateの値をUTCに変換する
  • 複数行あるのは出力(整形)のフォーマットを変えています
(Get-Date).ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss")
(Get-Date).ToUniversalTime().ToString("yyyy/MM/dd HH:mm")
(Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mmZ")

## 出力例
PS C:\Users\blotoyo> (Get-Date).ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss")
2022-06-24 22:48:51
PS C:\Users\blotoyo> (Get-Date).ToUniversalTime().ToString("yyyy/MM/dd HH:mm")
2022/06/24 22:48
PS C:\Users\blotoyo> (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mmZ")
2022-06-24T22:48Z

2.2. 現在時刻から-9時間して出力する

  • ToUniversalTimeメソッド: Get-Dateの値に時間数を加減して出力する
  • 複数行あるのは出力(整形)のフォーマットを変えています
Get-Date (Get-Date).AddHours(-9) -format "yyyy/MM/dd HH:mm:ss"
Get-Date (Get-Date).AddHours(-9) -format "yyyyMMdd_HH:mm:ss"
Get-Date (Get-Date).AddHours(-9) -format "yyyy-MM-ddTHH:mmZ"

## 出力例
PS C:\Users\blotoyo> Get-Date (Get-Date).AddHours(-9) -format "yyyy/MM/dd HH:mm:ss"
2022/06/24 23:04:04
PS C:\Users\blotoyo> Get-Date (Get-Date).AddHours(-9) -format "yyyyMMdd_HH:mm:ss"
20220624_23:04:04
PS C:\Users\blotoyo> Get-Date (Get-Date).AddHours(-9) -format "yyyy-MM-ddTHH:mmZ"
2022-06-24T23:04Z


3. JST(指定時刻)をUTCで出力する

  • System.DateTimeへ指定時刻を入れてTypeをDateTimeにし、
  • .AddHours(-9)で-9時間して、
  • .ToStringでフォーマットを修正しています。

※【注意】.AddHours(-9).ToStringの前に持ってくること。
 .ToStringを先にしてしまうとTypeがStringに変わってしまい、.AddHours(-9)が処理出来ない。

([System.DateTime]"2022/06/01 09:00:00").AddHours(-9).ToString("yyyy-MM-dd HH:mm:ss")
([System.DateTime]"2022-06-01 09:00:00").AddHours(-9).ToString("yyyy-MM-ddTHH:mm:ssZ")
([System.DateTime]"2022-06-01 09:00").AddHours(-9).ToString("yyyy/MM/dd HH:mm:ss")

## 出力例
PS C:\Users\blotoyo> ([System.DateTime]"2022/06/01 09:00:00").AddHours(-9).ToString("yyyy-MM-dd HH:mm:ss")
2022-06-01 00:00:00
PS C:\Users\blotoyo> ([System.DateTime]"2022-06-01 09:00:00").AddHours(-9).ToString("yyyy-MM-ddTHH:mm:ssZ")
2022-06-01T00:00:00Z
PS C:\Users\blotoyo> ([System.DateTime]"2022-06-01 09:00").AddHours(-9).ToString("yyyy/MM/dd HH:mm:ss")
2022/06/01 00:00:00


指定時刻部分を変数にしてみる。

${specify_time} = "2022-06-01 09:00"
([System.DateTime]"${specify_time}").AddHours(-9).ToString("yyyy/MM/dd HH:mm:ss")

## 出力例
PS C:\Users\blotoyo> ${specify_time} = "2022-06-01 09:00"
PS C:\Users\blotoyo> ([System.DateTime]"${specify_time}").AddHours(-9).ToString("yyyy/MM/dd HH:mm:ss")
2022/06/01 00:00:00