2017-10-16 21 views
7

dönüştürürken gün ışığından yararlanma hatası verirken @DateTimeFormat ek açıklamasını kullanmayan bir tarihi dönüştürme sorunu yaşıyorum. Ben olmak benim varlık içinde ek açıklama ile tarihi 15/10/2017, set Örneğin@DateTimeFormat

, şöyle: Anlıyorum

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; 

ben hata alırsınız hata, 15/10/2017 00:00:00 tarihinin gerçekte olmadığını, ancak bu şekilde sorunu görmezden ve muhabir tarihini bulma, 15/10/2017 01:00:00 dönüştürmek istiyorum söyler.

@DateTimeFormat ek açıklamasını geçersiz kılmanın bir yolu var mı yoksa biçimlendiriciyi hafifletmek için bir yol mu var?

+1

'Ne demek istediğini söyle ve ne demek istediğini söyle' Şu an çalıştığınız tarih ve saati temsil eden bir nesneye bir tarih koymaya çalışıyorsunuz. LocalDate'i kullanabilir misiniz, yoksa Date ile mi takıldınız? – mpkorstanje

+0

Özel deserializer oluşturabilirsiniz. AFAIR Jackson'ın kaputun altında kullanıyor. JsonDeserialize' ek açıklama yardımcı olmalıdır. [Jackson-Deserialization örneği.] (Http://www.baeldung.com/jackson-deserialization) –

+0

'@DateTimeFormat (iso = ISO.DATE_TIME)' i kullanmaya çalışın, dize –

cevap

3

bu deneyin:

@Column(nullable = false)

@NotNull

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

private Date dataVisita;

Size, aşağıdaki gibi bir validator uygulamak gerekir (1:00 0:00 ayarlayın) istediğini yapmak görünüyor:

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

iyi yakalama, @ OleV.V. – hd1

0

Java 8 sınıfı ve yeni (java 8'den beri) java.time "framework'ün bir parçası olan DateTimeFormat'u kullanmak istiyorsanız, muhtemelen Java 8 Tarih sınıflarını kullanmanız gerekir.

TARİH:.210 java.time.LocalDate

ZAMAN:
java.time.LocalTime, java.time.OffsetTime

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

Ayrıca, hangi ORM, Bahar çerçevenizle kullanıyorsunuz? Bahar verileri, hazırda bekletme ya da başka bir şey? Eğer DB tarihlerinizi saklamak şekline bağlı Mapping Date/Time Values

0

ve sunucu zaman dilimi, çözüm kullanılarak, Bahar başlatma üzerinde UTC için varsayılan zaman dilimini ayarlamak olacaktır: Eğer Hibernate kullanıyorsanız, o zaman hazırda Kullanım kılavuzuna başvurun aşağıdaki kodu: Benim için

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

1

, sistemin yerel ayarı ile doğrudan pisliği olmamalı. Senin problemin gerçekte bu.

Bir saat dilimi sağlamadığınız anlamına gelir, bu nedenle sunucuyu kullanıyorsunuz. Bu sunucuda yapılandırmasıyla, bu gün/tarih olacak. Başka bir sunucuda başka bir gün/tarih olur.

UTC'de (yani gün ışığı tasarrufu ve hepsi yok) veya girişte sağlanan açık bir yerel ayarda çalıştığınızdan, depolamak için yerel bir tarih kullandığınızdan emin olun ... Ya bunu istediğiniz gibi tutun ve ihtiyacınız olduğunda tarihleri ​​karşılaştırmak, UTC'ye dönüştürmek. Bu sayede sorun reddedilirdi.

Hızlı bir düzeltme, sunucunuzun UTC kullanmasını sağlamak içindir, ancak uzun vadede, çalıştığınız yerel ayarı her zaman denetlemeniz gerekir; bu nedenle sağlanan tarih UTC olmalı veya Yerel bir tarih ve başka bir alan da saat dilimini belirtmelidir. .

+0

"pt_BR" uygulaması için varsayılan yapılandırılmış bir yerel ayarım var, bu nedenle her zaman bu tarihler için kullanılacaktır – Thiesen

0

Bu gerçekten basit olmalıdır.

Burada sorun, bir Tarih Nesnesi için bir String değeri iletiyorsunuz.

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

Basitçe türleri burada koymak gereklidir: java.util.Date, java.util.Calendar, java.lang.Long, Joda-Time değer türleri Burada söz konusu ek açıklama için belgelerdir

çok naif yol:

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

Önerilen yol:

Kullanım:

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

ve

// '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"))); 

Umut!