2017-10-16 19 views
7

Tôi gặp sự cố khi chuyển đổi ngày thực sự không tồn tại bằng cách sử dụng chú thích @DateTimeFormat.@DateTimeFormat với lỗi tiết kiệm ánh sáng ban ngày khi chuyển đổi

Ví dụ, khi tôi thiết lập ngày 15/10/2017, với chú thích trong thực thể của tôi là như sau:

@Column(nullable = false) 
@NotNull 
@DateTimeFormat(pattern = "dd/MM/yyyy") 
private Date dataVisita; 

tôi nhận được lỗi:

Failed To Convert Property Value Of Type Java.Lang.String To Required Type Java.Util.Date For Property DataVisita; 
Nested Exception Is Org.Springframework.Core.Convert.ConversionFailedException: 
    Failed To Convert From Type Java.Lang.String To Type @Javax.Persistence.Column @Javax.Validation.Constraints.NotNull @Org.Springframework.Format.Annotation.DateTimeFormat Java.Util.Date For Value 15/10/2017; 
Nested Exception Is Java.Lang.IllegalArgumentException: 
    Cannot Parse "15/10/2017": Illegal Instant Due To Time Zone Offset Transition (America/Sao_Paulo) 

Tôi hiểu rằng lỗi cho tôi biết rằng ngày 15/10/2017 00:00:00 không thực sự tồn tại, nhưng tôi muốn chuyển đổi thành 15/10/2017 01:00:00, bỏ qua theo cách này vấn đề và tìm ngày phóng viên.

Có cách nào để tôi ghi đè chú thích @DateTimeFormat hoặc cách để chỉ định trình định dạng được khoan dung không?

+1

'Ý nghĩa của những gì bạn nói và nói ý của bạn' Bạn hiện đang cố gắng đặt ngày vào một đối tượng đại diện cho ngày và giờ. Bạn có thể sử dụng LocalDate hoặc bạn bị mắc kẹt với Ngày? – mpkorstanje

+0

Bạn có thể tạo trình tùy chỉnh deserializer. AFAIR nó sử dụng Jackson dưới mui xe. Chú thích 'JsonDeserialize' sẽ giúp ích. [Ví dụ về Jackson-Deserialization.] (Http://www.baeldung.com/jackson-deserialization) –

+0

Cố gắng sử dụng '@DateTimeFormat (iso = ISO.DATE_TIME)', nó sẽ không bỏ qua thời gian trong chuỗi –

Trả lời

3

Hãy thử điều này:

@Column(nullable = false)

@NotNull

@DateTimeFormat(pattern = "dd/MM/yyyy HH:mm:ss")

private Date dataVisita;

Có vẻ như để làm những gì bạn muốn (điều chỉnh 0:00-01:00), bạn sẽ cần phải thực hiện một validator như sau:

public class PersonValidator implements Validator { 

    /** 
    * This Validator validates *just* Person instances 
    */ 
    public boolean supports(Class clazz) { 
     return Date.class.equals(clazz); 
    } 

    public void validate(Object obj, Errors e) { 
     String dateString = (String) obj; 
     DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"); 
     DateTime ourDate = null; 
     try { 
      fmt.parseDateTime(dateString); 
     } catch (IllegalArgumentException e) { 
      // massage your hour here 
     } finally { 
      ourDate = fmt.parseDateTime(dateString); 
     } 
    } 
} 
+0

Bắt tốt, @ OleV.V. – hd1

0

Nếu bạn muốn sử dụng DateTimeFormat là lớp Java 8 và một phần khung công tác mới (kể từ java 8) "java.time", bạn có thể cần phải sử dụng các lớp Java 8 Ngày:

DATE:.210 java.time.LocalDate

TIME:
java.time.LocalTime, java.time.OffsetTime

dấu thời gian:
java.time.Instant, java.time.LocalDateTime, java.time. OffsetDateTime và java.time.ZonedDateTime

Ngoài ra, bạn đang sử dụng ORM nào với khung công tác Spring của mình? Dữ liệu mùa xuân, ngủ đông hoặc cái gì khác? Nếu bạn sử dụng Hibernate, sau đó tham khảo Hướng dẫn sử dụng Hibernate: Mapping Date/Time Values

0

Tùy thuộc vào cách bạn lưu trữ ngày của bạn trong DB và múi giờ của máy chủ của bạn, các giải pháp sẽ được thiết lập múi giờ mặc định của bạn để UTC vào mùa xuân khởi động, sử dụng đoạn mã sau:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

1

Đối với tôi, bạn không nên gây rối lên trực tiếp với các địa phương của hệ thống. Đó thực sự là vấn đề của bạn.

Tôi có nghĩa là bạn không cung cấp múi giờ, vì vậy bạn đang sử dụng một trong các máy chủ. Trên máy chủ này với cấu hình của nó, nó sẽ là ngày/ngày này. Trên một máy chủ khác, nó sẽ là một ngày/ngày khác.

Hãy chắc chắn rằng bạn làm việc hoặc trong UTC (vì vậy không tiết kiệm ánh sáng ban ngày và tất cả) hoặc một ngôn ngữ rõ ràng mà khách hàng cung cấp trong đầu vào, sử dụng một ngày địa phương để lưu trữ ... Hoặc giữ nó như thế và khi bạn cần để so sánh ngày, chuyển đổi thành UTC. Bằng cách này vấn đề sẽ biến mất.Sửa chữa nhanh là đảm bảo máy chủ của bạn sử dụng UTC nhưng về lâu dài, bạn luôn phải kiểm soát miền địa phương bạn làm việc, vì vậy ngày được cung cấp phải là UTC hoặc là ngày địa phương và trường khác cung cấp múi giờ .

+0

Tôi có ngôn ngữ được định cấu hình mặc định cho ứng dụng "pt_BR", vì vậy nó sẽ luôn sử dụng tính năng này cho các ngày – Thiesen

0

Điều này sẽ thực sự đơn giản.

Vấn đề ở đây là, bạn đang chuyển một giá trị chuỗi cho một đối tượng ngày tháng. Đây là tài liệu cho các chú thích trong câu hỏi:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/format/annotation/DateTimeFormat.html

một cách đơn giản ở đây là các loại yêu cầu: java.util.Date, java.util.Calendar, java.lang.Long, Joda thời gian các loại giá trị

Một cách rất ngây thơ:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
Date destnationDateToBeSaved = sdf.parse("15/10/2017"); 

Đề xuất cách:

Sử dụng:

@DateTimeFormat(iso = ISO.DATE_TIME) 
private ZonedDateTime zonedDateTime; 

// 'yyyy-MMM-dd HH:mm:ss' pattern or if preferred ISO 
ZonedDateTime destnationDateToBeSaved= ZonedDateTime.parse("2017-Oct-15 23:35:05", DateTimeFormatter.ofPattern("yyyy-MMM-dd HH:mm:ss").withZone(ZoneId.of("UTC"))); 

Hy vọng rằng sẽ giúp!

Các vấn đề liên quan