

画面入力値の西暦を、和暦に変換する必要があり、質問します。  
以下スースの通り作成したのですが、入力値の「月」が+1されてしまいます。  
解決法を教えてください。

入力値（以下ソースのcalender.set(2016, 3, 24);部分） → 2016, 3, 24  
実行結果 → 平成28年4月30日

となり3月となってほしいのに4月となってしまいます。

[code]

    import java.text.*;
    import java.util.*;
    
    public class MyTest {
      public static void main(String[] args) {
        Locale defaultLocale = new Locale("ja", "JP", "JP");
        DateFormat japaneseFormat = new SimpleDateFormat("GGGGy年M月d日",
                defaultLocale);
    
        Calendar calender = Calendar.getInstance();
        calender.set(2016, 3, 24);
    
        System.out.println(japaneseFormat.format(calender.getTime()));
      }
    }
    
[/code]

ポイントは、システム日付ではなく、外部から与えられた引数で西暦→和暦に変換したいです。


CC BY-SA 3.0
2016-03-25T10:19:12.190
23455
2016-03-28T02:09:23.557
2016-03-25T10:42:34.240
46
14939
question
java
javaで西暦→和暦変換がうまくいかない


Javadocにもひっそり書いてあるのですが、月は0始まりのためですね。

[Calendar#set(int, int, int) (Java Platform SE 8
)](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Calendar.html#set-
int-int-int-)

> month - MONTH カレンダフィールドの設定に使用する値。Month 値は 0 から始まる (1 月は 0 になる)。

3月にするためには、

[code]

        calender.set(2016, 2, 24);
    
[/code]

とする必要があります。


CC BY-SA 3.0
2016-03-25T10:26:14.343
23456
2016-03-25T10:48:15.727
2016-03-25T10:48:15.727
46
476
23455
answer


JDK8以降であれば、java.time.chrono.JapaneseDateを使って和暦を取得することもできます。こちらはそのままの月を設定できる感じです。  
[java.time.chrono.JapaneseDate](https://docs.oracle.com/javase/jp/8/docs/api/java/time/chrono/JapaneseDate.html)

[code]

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("Gyy年M月d日");
    JapaneseDate japaneseDate = JapaneseDate.of(2016, 3, 24);
    System.out.println(japaneseDate.format(formatter));
    // 平成28年3月24日
    
[/code]


CC BY-SA 3.0
2016-03-28T02:09:23.557
23524
2016-03-28T02:09:23.557
14890
23455
answer