java.util.Date
をJava 8 java.time.YearMonth
に変換するにはどうすればよいですか?java.util.DateをJava8に変換する方法java.time.YearMonth
は残念ながら次はDateTimeException
スロー:中
YearMonth yearMonth = YearMonth.from(date.toInstant());
結果:
java.time.DateTimeException: Unable to obtain YearMonth from TemporalAccessor: 2015-01-08T14:28:39.183Z of type java.time.Instant
at java.time.YearMonth.from(YearMonth.java:264)
...
私はJPAを使用してデータベースにYearMonth
値を格納したいので、私はこの機能が必要。現在、JPAはYearMonth
年代をサポートしていないので、私は、次のYearMonthConverter(輸入は省略)を作ってみた:
// TODO (future): delete when next version of JPA (i.e. Java 9?) supports YearMonth. See https://java.net/jira/browse/JPA_SPEC-63
@Converter(autoApply = true)
public class YearMonthConverter implements AttributeConverter<YearMonth, Date> {
@Override
public Date convertToDatabaseColumn(YearMonth attribute) {
// uses default zone since in the end only dates are needed
return attribute == null ? null : Date.from(attribute.atDay(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
}
@Override
public YearMonth convertToEntityAttribute(Date dbData) {
// TODO: check if Date -> YearMonth can't be done in a better way
if (dbData == null) return null;
Calendar calendar = Calendar.getInstance();
calendar.setTime(dbData);
return YearMonth.of(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1);
}
}
は(両方向のための)より良い(クリーナー、短い)解決策はありませんか?
私はjava.util.Date 'へのマッピングを避けるだろうa)それは 'java.sql。*' -typeではないので、b)暗黙的なタイムゾーン(パフォーマンスが悪く、システムタイムゾーンがあいまいになります)を含んでいるため、c)SQLはそのような型を年月に定義しません。 [PROLEPTIC_MONTH](http://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoField.html#PROLEPTIC_MONTH)を使用して、「YearMonth」を整数にマップすることをお勧めします。 –
@MenoHochschild:良いアイデアです - 注意しなければならないのは、データベース自体を見るときに読み込みができないということです。私の場合は問題ありません... – Sebastian
DBコンテンツの直接ビューでは整数だけが読み込めませんが、juDateへのマッピングはタイムゾーンのために視覚化された日付と月を(db管理者が見るように)変更することができます。コンバージョンとdb/server-settingsが含まれます。 –