【コラム】

Java API、使ってますか?

4 日時情報の取り扱いを改善する JSR 310: Date and Time API

 

4/60

Date and Time API

去る2月12日(米国時間)、Javaプログラムにおける日付情報や時間情報の取り扱いを大幅に改善してくれる「JSR 310: Date and Time API」がECによるJSR承認投票を通過し、標準仕様の策定作業に入った。スペックリードはStephen Colebourne氏とMichael Nascimento Santos氏が務め、エキスパートグループには両者のほかにフランスに本社を置くCapgeminiが名を連ねている。

現在、Javaではjava.util.Dateクラスとjava.util.Calendarクラスを使用して日付や時間の情報を取り扱っている。これらのクラスはシンプルではあるが、一方であまり使い勝手がいいとは言えず、また国際化関連の機能が弱いという問題も指摘されてきた。JSR 310の目的はこれらの問題を解消し、より高機能で包括的なモデルに基づいたAPIを提供することにある。

新しいAPIの詳細についてはまだ議論がスタートしたばかりだが、現時点では主に次のような機能が提供される予定となっている。

  • 時間を伴わないで日付を表す方法
  • 日付を伴わないで時間を表す方法
  • 今日や明日、昨日などの日付を簡単に作成する方法
  • 特定のタイムゾーンの日時を表す方法
  • タイムスタンプを表す方法
  • ナノ秒精度のタイムスタンプを実現
  • 日時データのシリアライズのサポート
  • 日付や時間の期間/間隔を表現する方法
  • タイムゾーン間の日時データの変換を容易に行う方法

当然ながら、既存のDateクラスやCalendarクラスなどとの互換性も考慮される。また、JDBCとの相性を良くすることなども課題として上げられている。

JSR 310は将来的に現行のDateクラスおよびCalendarクラスの代替としてJava SE 7に統合されることを目指す。そのために今年の半ばごろまでにEarly Draft Reviewを開始したいとのことだ。Java SE 7自身も詳細な仕様について現在議論が進められている最中だが、JSR 310もその候補として注目すべきAPIになりそうである。

JSR 310のアイデア元? Joda-Timeを試す

JSR 310のスペックリードであるColebourne、Santos両氏は、オープンソースで開発されている「Joda-Time」が同APIのアイデアの元になると語っている。Joda-TimeはColebourne氏が中心となって開発している、日付/時間情報を扱うためのオープンソースのJavaライブラリである。

もっとも両氏は、JSR 310が単なるJoda-Timeの焼き直しになるわけではないとも述べている。Joda-Time自身もさまざまな未解決の問題を抱えており、JSR 310ではJ2SE 5.0以降のJavaの新機能を活用してより洗練されたAPIに仕上げるとの話だ。

そうは言ってもJSR 310の仕様策定にJoda-Timeが大きな影響を与えることは間違いないだろう。そこで本稿ではJoda-Timeの使用方法を紹介することで、JSR 310が開発者にどのような機能を提供してくれるのかを見てみたいと思う。

Joda-Timeはここから入手することができる。

ダウンロードしたファイルを展開し、中に含まれている「joda-time-1.4.jar」をクラスパスに含めてコンパイル/実行すればよい。Joda-Timeでjava.util.Calendarクラスの代わりとなって日付/時間情報を扱うのはorg.joda.time.DateTimeクラスである。DateTimeクラスの使用例をリスト1に、その実行例をプロンプト1に示す。

リスト1 JodaSample.java - Joda-Timeの使用例

import java.util.Locale;
import org.joda.time.DateTime;

class JodaSample {
    public static void main(String[] args) {
        DateTime datetime = new DateTime();

        // フィールド値の取得
        System.out.println("現在の日時: " + datetime);
        int month = datetime.getMonthOfYear();
        System.out.println("月: " + month);

        // 日付の操作
        DateTime year2005 = datetime.withYear(2005);
        System.out.println("2005年の今日: " + year2005);
        DateTime oneMonthLater = datetime.plusMonths(1);
        System.out.println("1ヶ月後: " + oneMonthLater);

        // フィールド値を日本語ロケールで表示
        String japaneseEra = datetime.era().getAsShortText(Locale.JAPANESE);
        System.out.println("ERA: " + japaneseEra);
    }

プロンプト1 JodaSample.javaの実行例

> java -classpath '.:joda-time-1.4.jar' JodaSample
現在の日時: 2007-03-03T13:21:54.764+09:00
月: 3
2005年の今日: 2005-03-03T13:21:54.764+09:00
1ヶ月後: 2007-04-03T13:21:54.764+09:00
ERA: 西暦

DateTimeクラスには複数のコンストラクタが用意されており、さまざまな形式でオブジェクトを生成できるようになっている。年月や時間の各フィールド値を取得する方法は2種類ある。ひとつはgetMonthOfYear()などのメソッドを使用して直接値を取り出す方法で、もうひとつはmonthOfYear()などのメソッドで取得したDateTime.Propertyオブジェクトからget()メソッドで値を取り出す方法だ。その他、DateTimeクラスには日付や時間の可算/減算を行うなどといった便利なメソッドが多数用意されている。

Joda-Timeでデフォルトで使用されるカレンダーはグレゴリオ暦をベースにしたISO8601スタンダードだが、その他にも仏暦、コプト暦、ユリウス暦、エチオピア暦、イスラム暦などのカレンダーをサポートしている。これらのカレンダーはChronology抽象クラスを継承した各クラスによって表され、リスト2のようにして使用する。

リスト2 JodaSample2.java - さまざまな暦をサポートしている

import java.util.Locale;
import org.joda.time.chrono.BuddhistChronology;
import org.joda.time.chrono.CopticChronology;
import org.joda.time.Chronology;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;

class JodaSample2 {
    public static void main(String[] args) {
        DateTimeZone timeZone = DateTimeZone.forID("Asia/Tokyo");
        Chronology buddist = BuddhistChronology.getInstance(timeZone);

        // 仏暦
        DateTime buddistTime = new DateTime(buddist);
        System.out.println("仏暦での日時: " + buddistTime);
        System.out.println
            ("ERA: " + buddistTime.era().getAsShortText(Locale.JAPANESE));

        // コプト暦
        Chronology coptic = CopticChronology.getInstance(timeZone);
        DateTime copticTime = new DateTime(coptic);
        System.out.println("コプト暦での日時: " + copticTime);
        System.out.println
            ("ERA: " + copticTime.era().getAsShortText(Locale.JAPANESE));
    }
}

プロンプト2 JodaSample2.javaの実行例

> java -classpath '.:joda-time-1.4.jar' JodaSample2
仏暦での日時: 2550-03-03T13:22:15.268+09:00
ERA: BE
コプト暦での日時: 1723-06-24T13:22:15.294+09:00
ERA: AM

まとめ - 実用化前でもトライする価値の高いAPI

JSR 310はつい最近ECによる承認投票を通過したばかりの非常に新しいJSRであり、まだ仕様策定のスタートラインに立った段階だと言える。しかしそのような新しいJSRでも、多くの人の要望から生まれたことを考えればアイデアの元になったツールが存在するかもしれない。とくにJSR 310のように、今後Javaのコアパッケージに含まれるかもしれない重要なAPIについては、ベースとなるライブラリを見つけて予習しておくのがいいだろう。またJoda-Time自身も優れたライブラリなので、JSR 310が実用化されるまではDateやCalendarのかわりに使ってみことをお勧めしたい。

提供:毎日就職ナビ

会員登録はこちら

学生のための就職情報サイト「毎日就職ナビ」。6,000社以上の新卒採用情報が常時掲載され、社内の雰囲気が伝わる情報画面、さまざまな項目での会社検索、エントリーや説明会検索など、機能も充実。無料適職診断、就活Q & A、エントリーシート添削講座など、就職活動に役立つ記事も満載です。研究者、エンジニアを目指す学生の方々も是非エントリーしてください。お待ちしています!

毎日コミュニケーションズはプライバシーマークを取得しています。

4/60

インデックス

連載目次
第60回 どうなる? 今後のJavaプラットフォーム(Java SE編)
第59回 どうなる? 今後のJavaプラットフォーム(Java EE編)
第58回 Java SE 7の要注目機能"クロージャ"はどうなるのか その6
第57回 Java SE 7の要注目機能"クロージャ"はどうなるのか その5
第56回 Java SE 7の要注目機能"クロージャ"はどうなるのか その4
第55回 Java SE 7の要注目機能"クロージャ"はどうなるのか その3
第54回 Java SE 7の要注目機能"クロージャ"はどうなるのか その2
第53回 Java SE 7の要注目機能"クロージャ"はどうなるのか
第52回 Early Draftが公開されたJSF 2.0
第51回 EJBから独立したJava Persistence 2.0
第50回 モバイルJavaの新しい潮流となるか - MSA 2.0のドラフト公開
第49回 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む
第48回 JOGLで3Dプログラミング その4
第47回 JOGLで3Dプログラミング その3
第46回 JOGLで3Dプログラミング その2
第45回 JOGLで3Dプログラミング
第44回 JARファイルを効率的にネットワーク転送するためのPack200形式
第43回 Early Draftで把握するEJB 3.1の新機能
第42回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その2
第41回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その1
第40回 リソースアダプタによる接続の仕組み
第39回 JCAを利用したシステム間接続
第38回 Java EEと外部システムの接続性を支えるJCAがバージョンアップ
第37回 Javaのモジュラリティ強化を担う"スーパーパッケージ"とは
第36回 JSR 308対応のコンパイラを試す
第35回 公開されたJSR 308のEarly Draftを検証する
第34回 スクリプト言語とJavaを結びつけるJSR 223
第33回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2
第32回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その1
第31回 Javaの文法がそのまま使えるスクリプト言語"BeanShell"
第30回 Javaアプリケーションにオブジェクトのキャッシュ機構を提供するJCache API
第29回 Javaアプリケーションからのリソース管理を可能にするJSR 284
第28回 XMLデータソースへの問い合わせはJSR 225で
第27回 Portlet Specification 2.0をもっと手軽に利用する
第26回 次期Javaポートレット仕様となるJSR 286
第25回 JSFとポートレットをつなげるJSR 301
第24回 Webサービス向けのポートレット仕様「WSRP」
第23回 高い相互運用性を実現するポートレットAPI - JSR 168
第22回 Java EE環境でタスクのスケジューリングを可能にするJSR 236
第21回 Java EE環境でのスレッドプログラミングを可能にするJSR 237
第20回 音声認識/合成のためのAPI - Java Speech APIとJSR 113
第19回 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入
第18回 JAX-RSで簡単RESTful - JSR 311
第17回 待望のServlet 3.0がJSRに登場 - JSR 315
第16回 アノテーションを使ってバグ退治 - JSR 305
第15回 アノテーションをさらに広い範囲で利用可能にするJSR 308
第14回 Webアプリケーション開発の要となるか - JSF 2.0がJSRに登場
第13回 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262
第12回 Javaアプリケーションのモジュール化をサポートするJava Module System
第11回 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform
第10回 JSR 295: Beans Bindingの参照実装を試す
第9回 けっこう便利! 単位を扱うAPI -- JSR 275: Units Specification
第8回 アノテーションでバリデーション - JSR 303: Bean Validator
第7回 Swing開発の救世主となるか - Swing Application Framework
第6回 JavaBeansのプロパティを同期させるバインディングAPI
第5回 誰よりも早く"Java SE 7"を睨む
第4回 日時情報の取り扱いを改善する JSR 310: Date and Time API
第3回 古いAPIも進化している!? - JSR 919: JavaMail 1.4
第2回 JSR 1 リアルタイムJava仕様
第1回 JCPによって進められるJava関連技術の標準化

もっと見る



転職ノウハウ

あなたが本領発揮できる仕事を診断
あなたの仕事適性診断

シゴト性格・弱点が20の質問でサクッと分かる!

「仕事辞めたい……」その理由は?
「仕事辞めたい……」その理由は?

71%の人が仕事を辞めたいと思った経験あり。その理由と対処法は?

3年後の年収どうなる? 年収予報
3年後の年収どうなる? 年収予報

今の年収は適正? 3年後は? あなたの年収をデータに基づき予報します。

激務な職場を辞めたいが、美女が邪魔して辞められない
激務な職場を辞めたいが、美女が邪魔して辞められない

美人上司と可愛い過ぎる後輩に挟まれるエンジニアの悩み

人気記事

一覧

イチオシ記事

新着記事

[実力試し]HTML5 認定試験 Lv1 想定問題 (5) HTML5のコメント記述法
[10:00 8/27] 企業IT
お金の使い方は上手ですか? -「安物買いの銭失い」「ときどき爆買い」
[10:00 8/27] マネー
MF文庫J、8月新刊は9タイトル! 『ノゲラ』『アリア』などの最新巻が登場
[10:00 8/27] ホビー
『マジきゅんっ!ルネッサンス』追加キャスト発表! 主人公役は千本木彩花
[10:00 8/27] ホビー
バージョンアップで人間にまた近づいた? - 進化を続ける「ロボホン」が生活を変える!
[09:00 8/27] スマホとデジタル家電

求人情報