5
1

More than 1 year has passed since last update.

【VTL】Velocity Template Languageで日時を加算・減算する

Last updated at Posted at 2022-05-31

概要

VTLで日時を加算・減算するのにハマったので備忘録として記載しておきます。

VTL(Velocity Template Language)とは?
 Apache Velocityで使用できる言語です。
 AWS AppSyncのResolverテンプレートで使用されています。

やりたいこと

今日日付の文字列を1日減算して昨日日付の文字列を生成したい! 
※フォーマットは「yyyyMMdd」形式

コードと解説

簡単に説明するとやっていることはこうだ!!

  1. 減算したいyyyyMMdd形式の日時をミリ秒に変換する
  2. 変換された日時から1日(=86,400,000ミリ秒)分を減算する
  3. 減算した日時をミリ秒から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の開発者ガイドに書いてあったのです!!
公式はよく読むのが大事だと身をもって学びました。

参考リンク

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1