相対時間で表記した期間をパースするJavaライブラリを作ってみた

正確に言うと自分で作ったのではなく、AirframeというScalaライブラリに相対時間で表記した期間をパースしてくれる機能があるのですが、わけあってこれをJavaにポーティングしてみました。

github.com

Maven Centralにdeployしてあるのでpom.xmlに以下の依存関係を追加すれば使えます。

<dependencies>
  <dependency>
    <groupId>com.github.takezoe</groupId>
    <artifactId>jtimewindow</artifactId>
    <version>1.0.0</version>
  </dependency>
</dependencies>

実際の使い方はこんな感じです。オフセットは基準となる現在日時で、指定しなかった場合はシステム日付が使用されます。期間はZonedDateTimeだけでなくInstantやエポックタイムで取得することもできます。

import com.github.takezoe.jtimewindow.*;

TimeWindowBuilder t = TimeWindow
  .withTimeZone("PDT")
  .withOffset("2016-06-26 01:23:45-0700");

TimeWindow w = t.parse("-7d");

ZonedDateTime start = w.getStart();
ZonedDateTime end = w.getEnd();

READMEからの抜粋ですが、以下のような感じで簡潔かつ柔軟な表記が可能です(結果は現在時刻を2016-06-26 01:23:45-0700に設定した場合の例です)。

Duration Definition start end (exclusive)
0h this hour 2016-06-26 01:00:00-0700 2016-06-26 02:00:00-0700
0d today 2016-06-26 00:00:00-0700 2016-06-27 00:00:00-0700
0M this month 2016-06-01 00:00:00-0700 2016-07-01 00:00:00-0700
-1h last hour 2016-06-26 00:00:00-0700 2016-06-26 01:00:00-0700
-1h/now last hour to now 2016-06-26 00:00:00-0700 2016-06-26 01:23:45-0700
-60m/2017-01-23 01:23:45 last 60 minutes to now 2017-01-23 00:23:00-0700 2017-01-23 01:23:45-0700
-1d last day 2016-06-25 00:00:00-0700 2016-06-26 00:00:00-0700
-7d last 7 days 2016-06-19 00:00:00-0700 2016-06-26 00:00:00-0700
-7d/now last 7 days to now 2016-06-10 00:00:00-0700 2016-06-26 01:23:45-0700
-3d/2017-04-07 last 3 days from a given offset 2017-04-04 00:00:00-0700 2017-04-07 00:00:00-0700
+7d next 7 days (including today) 2016-06-26 00:00:00-0700 2016-07-03 00:00:00-0700
+7d/now next 7 days from now 2016-06-26 01:23:45-0700 2016-07-03 00:00:00-0700
-1w last week 2016-06-13 00:00:00-0700 2016-06-20 00:00:00-0700
-1M last month 2016-05-01 00:00:00-0700 2016-06-01 00:00:00-0700
-1y last year 2015-01-01 00:00:00-0700 2016-01-01 00:00:00-0700
-1h/2017-01-23 01:00:00 last hour to a given offset 2017-01-23 00:00:00-0700 2017-01-23 01:00:00-0700
-1h/2017-01-23 01:23:45 last hour to a given offset 2017-01-23 00:00:00-0700 2017-01-23 01:23:45-0700