JavaでString型の日付文字列をCalendar型へ変換する場合、
基本的には「文字列 → Date → Calendar」の順で変換します。
フォーマットを正しく指定すれば、安全にCalendar型へ変換できます。
日付フォーマットが決まっている場合は SimpleDateFormat を使用し、
Java 8以降では LocalDateTime を経由して変換する方法も利用できます。
本記事では、実務でよく使う変換方法と注意点を分かりやすく解説します。
String型をCalendar型へ変換する基本方法
最も一般的な方法は、SimpleDateFormat を使って Date に変換し、
その後 Calendar に設定する方法です。
例:yyyy/MM/dd 形式の文字列を変換する
|
1 2 3 4 5 6 7 |
String strDate = "2026/01/31"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); Date date = sdf.parse(strDate); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); |
この処理の流れは次の通りです。
| 処理 | 内容 |
|---|---|
| SimpleDateFormat | 文字列の形式を指定 |
| parse() | String → Date に変換 |
| Calendar.setTime() | Date → Calendar に設定 |
時刻を含む文字列を変換する方法
時刻情報が含まれる場合は、フォーマットも時刻に合わせます。
例:yyyy/MM/dd HH:mm:ss 形式
|
1 2 3 4 5 6 7 |
String strDateTime = "2026/01/31 15:30:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date date = sdf.parse(strDateTime); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); |
フォーマット指定例
| 文字列形式 | フォーマット |
|---|---|
| 2026/01/31 | yyyy/MM/dd |
| 2026-01-31 | yyyy-MM-dd |
| 2026/01/31 10:20:30 | yyyy/MM/dd HH:mm:ss |
| 20260131102030 | yyyyMMddHHmmss |
Java 8以降:LocalDateTime経由で変換する方法
Java 8以降では、java.time パッケージを使う方法が推奨されます。
例:LocalDateTime → Calendar
|
1 2 3 4 5 6 7 8 9 10 |
String strDateTime = "2026-01-31T15:30:00"; DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; LocalDateTime localDateTime = LocalDateTime.parse(strDateTime, formatter); ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()); Date date = Date.from(zonedDateTime.toInstant()); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); |
この方法のメリット
| 項目 | 内容 |
|---|---|
| スレッドセーフ | SimpleDateFormatより安全 |
| 可読性 | フォーマット指定が明確 |
| 推奨API | 将来的にも安定 |
例外処理は必ず実装する
parse() メソッドは ParseException を投げる可能性があります。
必ず例外処理を記述してください。
|
1 2 3 4 5 6 7 8 9 |
try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); Date date = sdf.parse("2026/01/31"); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); } catch (ParseException e) { e.printStackTrace(); } |
タイムゾーンを指定して変換する方法
サーバーと表示時刻がズレる場合は、タイムゾーンを明示的に指定します。
|
1 2 3 4 5 6 7 8 9 |
String strDate = "2026/01/31 12:00:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo")); Date date = sdf.parse(strDate); Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); calendar.setTime(date); |
よくある変換エラーと原因
| エラー内容 | 主な原因 |
|---|---|
| ParseException | フォーマットと文字列が不一致 |
| 日付がずれる | タイムゾーン未指定 |
| 月がずれる | Calendarの月は0始まり |
月が0始まりである点に注意
|
1 |
int month = calendar.get(Calendar.MONTH) + 1; |
よくある質問(Q & A)
- CalendarとDateはどちらを使うべきですか?
-
新規開発では
LocalDateやLocalDateTimeを推奨します。ただし、既存システムとの互換性が必要な場合はCalendarを使用します。 - SimpleDateFormatはスレッドセーフですか?
-
スレッドセーフではありません。マルチスレッド環境では個別に生成してください。
- yyyyとYYYYの違いは何ですか?
-
yyyyは暦年、YYYYは週ベース年です。通常はyyyyを使用します。
- 変換できない場合のデバッグ方法は?
-
入力文字列とフォーマットをログ出力して一致しているか確認してください。
まとめ
String型からCalendar型への変換は、
「文字列 → Date → Calendar」の順で行います。
日付フォーマットを正確に指定し、例外処理とタイムゾーンに注意すれば、
安全にCalendar型へ変換できます。
Java 8以降では LocalDateTime を経由する方法も有効です。
既存仕様に合わせて最適な方法を選択してください。
