Javaの日付の扱いにうんざりしている人はJodaTimeをつかうといいよ

まあ表題のとおりなんですがJavaの標準でついているjava.util.Dateが非推奨メソッドの嵐で、日付オブジェクトからYear取りたいだけなのに、Calendarへ変換してさらに、凄く面倒くさい引数とかつけて取得しなくてはいけなくて正直うんざりしていました。歴史的背景はこのブログに書いてあったんでなんとなく察しましたが現在使っている人からすれば知るかという話ですし、無駄な苦労をしたくないなと思って誰かがこう思ってなんか対策してるだろうというのぞみをかけて調べていたらjoda-timeがでてきました。


とりあえず基本的な使い方を逆引き的にめもっとこうかと思いました。

install

テスト的に使いたい場合

http://sourceforge.net/projects/joda-time/files/joda-time/2.0/

ここにあるのでここからtar.gzを落としてきます。

mkdir -p ~/local/work/java/jodatime
tar zxvf joda-time-2.0-dist.tar.gz
cp joda-time-2.0/joda-time-2.0.jar ~/local/work/java/jodatime
mavenで管理する場合

pom.xmlへこれを含めてやる

<dependencies>
     <dependency>
         <groupId>joda-time</groupId>
         <artifactId>joda-time</artifactId>
         <version>2.0</version>
     </dependency>
</dependencies>

java,javacでの手動コンパイル時の注意

両方共 -classpathへjoda-time-2.0.jarを含めてやらないとだめ。

生成

  1 import org.joda.time.DateTime;
  2 
  3 public class Main {
  4     public static void main(String[] args) {
  5         DateTime dt = new DateTime();
  6         System.out.println(dt);
  7     }
  8 }  

日付をすすめる

同様の処理は年・月・週でも可能で(plusYears,plusMonths,plusWeeks)となる

  1 import org.joda.time.DateTime;
  2 
  3 public class Main {
  4     public static void main(String[] args) {
  5         DateTime dt = new DateTime();
  6         System.out.println(dt.plusDays(1));
  7     }
  8 }   

日付を遡らせる

同様の処理は年・月・週でも可能で(minusYears,minusMonths,minusWeeks)となる

  1 import org.joda.time.DateTime;
  2 
  3 public class Main {
  4     public static void main(String[] args) {
  5         DateTime dt = new DateTime();
  6         System.out.println(dt.minusDays(1));
  7     }
  8 }   

文字列からDateTimeへ変換

  1 import org.joda.time.DateTime;
  2 import org.joda.time.format.DateTimeFormatter;
  3 import org.joda.time.format.DateTimeFormat;
  4 
  5 public class Main {
  6     public static void main(String[] args) {
  7 
  8         String str = "2010-12-13";
  9 
 10         DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd");
 11         DateTime dt                 = formatter.parseDateTime(str);
 12 
 13         System.out.println(dt);
 14     }
 15 }

ちなみにPerlだとDateTimeモジュールでDateTime::Format::Strptimeというモジュールがあって同様のことができる。

型変換(Date,Calendar)

  1 import org.joda.time.DateTime;
  2 import org.joda.time.DateTimeZone;
  3 import org.joda.time.format.DateTimeFormatter;
  4 import org.joda.time.format.DateTimeFormat;
  5 
  6 import java.util.*;
  7 
  8 public class Main {
  9     public static void main(String[] args) {
 10 
 11         DateTime dt  = new DateTime();
 12 
 13         Date date    = dt.toDate();
 14 
 15         System.out.println(date);
 16 
 17         Calendar cal      = dt.toCalendar(Locale.JAPAN);
 18 
 19         System.out.println(cal);
 20     }
 21 }