概要
VTLで日時を加算・減算するのにハマったので備忘録として記載しておきます。
VTL(Velocity Template Language)とは?
Apache Velocityで使用できる言語です。
AWS AppSyncのResolverテンプレートで使用されています。
やりたいこと
今日日付の文字列を1日減算して昨日日付の文字列を生成したい!
※フォーマットは「yyyyMMdd」形式
コードと解説
簡単に説明するとやっていることはこうだ!!
- 減算したいyyyyMMdd形式の日時をミリ秒に変換する
- 変換された日時から1日(=86,400,000ミリ秒)分を減算する
- 減算した日時をミリ秒からyyyyMMdd形式に変換しなおす
#set($jstToday = $util.time.parseFormattedToEpochMilliSeconds("$today 00:00:00+0900", "yyyyMMdd HH:mm:ssZ"))
#set($jstYesterday = $jstToday - 86400000)
#set($yesterday = $util.time.epochMilliSecondsToFormatted($jstYesterday, "yyyyMMdd", "+09:00"))
※$todayにはyyyyMMdd形式の日付文字列をセットしている。
詳しく見ていこう!!!
1. 減算したい日時をミリ秒単位の日本標準時(JST)に変換する
下記の関数を使用して、yyyyMMdd形式からミリ秒単位の日本標準時(JST)にする。
$todayはyyyyMMdd
なので、指定した形式yyyyMMdd HH:mm:ssZ
に合わせる。
$util.time.parseFormattedToEpochMilliSeconds(String, String) : Long
文字列型として渡されたタイムスタンプと形式を解析し、エポックからのミリ秒単位のタイムスタンプを返す関数。
2. ミリ秒単位の日本標準時(JST)から減算する
1日(=24時間)をミリ秒に変換すると86,400,000ミリ秒
ステップ1で算出したミリ秒単位の日本標準時(JST)から86,400,000ミリ秒を減算する。
3. 減算されたミリ秒単位の日本標準時(JST)を指定した形式に変換する
下記の関数を使用して、ミリ秒単位の日本標準時(JST)からyyyyMMdd形式の日本時間(+09:00)に変換する。
$util.time.epochMilliSecondsToFormatted(long, String, String) : String
long型として渡されたエポックからのミリ秒単位のタイムスタンプを、文字列型で指定された形式と時差に合わせて、タイムスタンプに変換する関数。
これで年跨ぎ、月跨ぎの日時計算もできます!
上記では減算していますが、加算するときは+すればよいだけです。
参考
1時間‥3,600,000ミリ秒
1日‥86,400,000ミリ秒
1ヶ月‥2,629,800,000ミリ秒
1年‥31,557,600,000ミリ秒
おまけ雑談
AWS AppSyncのResolverテンプレートでVTLを初めて使いました。
「日付の加算・減算の関数くらい用意されているだろう」と探しましたが見つからず…
悩みに悩んだ末、見つけたのがこの方法です。
実はAWS AppSyncの開発者ガイドに書いてあったのです!!
公式はよく読むのが大事だと身をもって学びました。
参考リンク