現代の SNS やコミュニケーションツールでは、ユーザーが「5 分前」「昨日」などの直感的な表現を求めています。機械的な ISO 形式の日時文字列は、文脈に応じて認識するまでに時間がかかるため、ユーザーエクスペリエンス(UX)において優れていません。この課題に対する解決策として、Java 開発者の間で広く利用されているオープンソースライブラリPrettyTimeがあります。本稿では、このライブラリを用いて自然言語による日時相対表現を実装する方法について解説します。
PrettyTime の概要と特徴
PrettyTime は、軽量かつ柔軟な設計を持つ Java クラスライブラリです。主な目的は、基準となる日時情報に対して差異を計算し、その結果を人間的に理解しやすいテキストに変換することにあります。単なる秒数や時間の計算ではなく、「約 2 時間後」「10 分ほど前」といった文脈に即した文章を生成できます。
- 多言語対応(i18n): デフォルトで多数のロケールに対応しており、設定次第で英語だけでなく日本語など任意の言語環境での出力が可能です。
- 単位のカスタマイズ: 秒、分、時、日、週、月、年など、比較対象とする時間単位を細かく制御できる仕組みを持っています。
- NLP 機能: 標準機能に加え、自然言語処理モジュールを提供しており、文字列から日時情報を解析する用途にも応用可能です。
Maven への依存追加
プロジェクト内で利用を開始するには、ビルドツール経由で依存関係を定義する必要があります。Maven を使用している場合、pom.xml 内に以下の配置を追加してください。最新版のバージョン番号を確認の上、反映させてください。
<dependency>
<groupId>org.ocpsoft.prettytime</groupId>
<artifactId>prettytime</artifactId>
<version>4.0.6.Final</version>
</dependency>
実装例:簡易的なラッパークラスの利用
直接的なインスタンス生成を行う代わりに、汎用的なヘルパーメソッドを作成して管理するとコードの見通しが良くなります。以下に、現在の時間を取得し、過去および未来の日時変換を行うサンプルを示します。変数名やメソッド構成を整理し、より現代的な Java 記法を採用しています。
import org.ocpsoft.prettytime.PrettyTime;
import java.util.Date;
import java.util.Locale;
public class SocialTimeFormatter {
// ロケールを指定した PrettyTime インスタンスを生成
private static final PrettyTime ENGLISH_FORMATTER = new PrettyTime(Locale.ENGLISH);
private static final PrettyTime JAPANESE_FORMATTER = new PrettyTime(Locale.JAPAN);
public static void main(String[] testArgs) {
long nowTimestamp = System.currentTimeMillis();
// 過去:5 分前の時点
Date pastMoment = new Date(nowTimestamp - 300_000);
// 未来:1 時間後の時点
Date futureMoment = new Date(nowTimestamp + 3_600_000);
// 日本語での表示
String jpResult = JAPANESE_FORMATTER.format(pastMoment);
System.out.println("【JP】" + jpResult);
// 英語での表示
String enResult = ENGLISH_FORMATTER.format(futureMoment);
System.out.println("【EN】" + enResult);
}
}
詳細な制御と拡張機能
PrettyTime は基礎的な変換だけでなく、より複雑なユースケースにも対応できます。
ローカライゼーションの明示的指定
システムデフォルトのロケールとは異なる言語環境を強制したい場合、コンストラクタ引数や静态メソッドを利用します。上記の例のように、インスタンスごとに異なるロケールを設定することで、グローバル展開されるアプリケーション内ですぐに切り替えが可能になります。
フレームワークとの統合
Web エンジン上での利用も考慮されています。JSP や JSF 環境において、JSTL タグとして組み込む機能が提供されています。これにより、データベースから取得したタイムスタンプを画面表示時に自動的に整形することが可能になり、コントローラー層の負担を減らすことができます。
- JSTL Tag: テンプレート内のタグエディタから直接呼び出し可能。
- JSF Converter: エンティティ変換ルールとして登録可能。
コアモジュールの構成
ライブラリの内部構造はモジュール化されており、拡張性を確保しています。例えば、独自の時間単位(秒未満のミリ秒などを優先表示するなど)を定義する場合は、units ディレクトリ内のロジックを基にして継承または実装を行うことで、挙動を微調整することが可能です。
NLP モジュールの活用
ユーザーが入力した自由テキスト(例:「来週の火曜日」)に含まれる日付情報を抽出する際、nlp セクションにあるパース機能を利用できます。これはチャットボットやスケジュール管理アプリケーションの入力処理などで有効に働きます。