Làm cách nào để chuyển đổi tốt nhất một java.util.Date
sang Java 8 java.time.YearMonth
?Làm thế nào để chuyển đổi java.util.Date sang Java8 java.time.YearMonth
Thật không may là sau ném một DateTimeException
:
YearMonth yearMonth = YearMonth.from(date.toInstant());
kết quả trong:
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)
...
tôi cần chức năng này vì tôi muốn để lưu trữ YearMonth
giá trị trong một cơ sở dữ liệu sử dụng JPA. Hiện nay JPA không hỗ trợ YearMonth
's, vì vậy tôi đã đi lên với các YearMonthConverter sau (nhập khẩu bỏ qua):
// 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);
}
}
Không phải là có một tốt hơn (sạch hơn, ngắn hơn) giải pháp (cho cả hai hướng)?
Cá nhân tôi sẽ tránh lập bản đồ cho 'java.util.Date 'vì a) nó không phải là' java.sql. * '-type, b) bao gồm múi giờ ngầm định (hiệu suất kém và sử dụng mờ của múi giờ hệ thống), c) SQL không định nghĩa kiểu như vậy cho năm-tháng. Bản đồ tốt hơn 'YearMonth' thành số nguyên sử dụng [PROLEPTIC_MONTH] (http://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoField.html#PROLEPTIC_MONTH) –
@MenoHochschild: Đó là một ý tưởng hay - chỉ báo trước là nó không thể đọc được khi nhìn vào cơ sở dữ liệu. Không có vấn đề gì trong trường hợp của tôi ... – Sebastian
Vâng, chỉ một số nguyên không thể đọc được để xem trực tiếp nội dung của db, nhưng lưu ý rằng, ánh xạ tới juDate có thể thay đổi ngày và tháng được hiển thị (khi quản trị viên db nhìn thấy nó) do múi giờ chuyển đổi và db/cài đặt máy chủ. –