2017-10-16 6 views
7

@DateTimeFormat 주석을 사용하여 실제로 존재하지 않는 날짜를 변환하는 데 문제가 있습니다. 내가있는 내 개체에 주석과 날짜 15/10/2017을 설정하면 예를 들어변환 할 때 일광 절약 시간이 적용되는 @DateTimeFormat

는 다음과 같이 내가 이해

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) 

:

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

나는 오류가 나타납니다 오류는 날짜가 15/10/2017 00:00:00이 실제로 존재하지 않는다는 것을 알려주지 만, 15/10/2017 01:00:00으로 변환하여 문제를 무시하고 해당 날짜를 찾습니다.

@DateTimeFormat 주석을 덮어 쓸 방법이 있습니까? 아니면 포맷터가 관대하지 못하도록하는 방법이 있습니까?

+1

'당신이 말하고 말하는 것을 의미합니다.'현재 날짜와 시간을 나타내는 개체에 날짜를 넣으려고합니다. LocalDate를 사용할 수 있습니까? 아니면 Date가 붙어 있습니까? – mpkorstanje

+0

사용자 정의 직 병렬 변환기를 만들 수 있습니다. AFAIR은 잭슨을 두포로 사용합니다. 'JsonDeserialize' 주석이 도움이 될 것입니다. [Jackson-Deserialization 예] (http://www.baeldung.com/jackson-deserialization) –

+0

'@DateTimeFormat (iso = ISO.DATE_TIME)'을 사용하려고하면 문자열의 시간을 무시하지 않습니다. –

답변

3

이 시도 :

@Column(nullable = false)

@NotNull

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

private Date dataVisita;

당신이, 당신은 다음과 같이 validator를 구현해야합니다 (1시부터 0시까지을 조정)하고 싶은 것을 할 것 같다 :

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

좋은 캐치, @ OleV.V. – hd1

0

DateTimeFormat을 Java 8 클래스와 새로운 (Java 8 이후) "java.time"프레임 워크의 일부로 사용하려면 Java 8 Date 클래스를 사용해야합니다.

날짜 :,210 java.time.LocalDate

시간 :
java.time.LocalTime, java.time.OffsetTime

TIMESTAMP :
java.time.Instant, java.time.LocalDateTime, java.time. OffsetDateTime 및 java.time.ZonedDateTime

또한 어떤 ORM을 Spring 프레임 워크에서 사용하고 있습니까? 봄 데이터, 최대 절전 모드 또는 다른 뭔가? 당신은 DB에 날짜를 저장하는 방법에 따라 Mapping Date/Time Values

0

및 서버 시간대는 솔루션은을 사용하여, 봄 초기화에 UTC에 기본 시간대를 설정하는 것입니다 : 당신이 최대 절전 모드를 사용하는 경우, 최대 절전 모드 사용 설명서를 참조 다음 코드 : 나를 위해

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

1

, 당신은 시스템의 로케일을 직접 엉망 안. 그게 네 문제가 진정 무엇인지.

시간대를 제공하지 않았으므로 서버 중 하나를 사용하고 있다는 의미입니다. 이 서버는 설정과 함께이 날짜/날짜가됩니다. 다른 서버에서는 하루 또 다른 날짜가됩니다.

클라이언트가 입력으로 제공 한 명시 적 로케일 인 UTC (일광 절약 시간)로 작업하고 로컬 날짜를 사용하여 저장해야합니다. 필요할 때 언제든지 보관하십시오. 날짜를 비교하려면 UTC로 변환하십시오. 이 방법은 문제가 사라질 것입니다.

빠른 수정은 서버에서 UTC를 사용하도록 보장하는 것입니다.하지만 장기적으로는 항상 작업 할 로캘을 제어해야하므로 제공된 날짜가 UTC이거나 로컬 날짜 여야하고 다른 필드가 시간대를 제공해야합니다 .

+0

응용 프로그램 "pt_BR"의 기본 로케일이 있으므로 항상 날짜에 사용합니다 – Thiesen

0

이것은 정말 간단해야합니다.

여기서 문제는 Date 객체에 대한 문자열 값을 전달한다는 것입니다.

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

간단하게 유형이 여기에 넣어 필요합니다 : java.util.Date, java.util.Calendar에, java.lang.Long의, Joda 타임 값 형식 여기에 문제의 주석에 대한 문서입니다

아주 순진 방법 :

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

권장 방법 :

사용 :

도움
@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"))); 

희망!