2016-01-18 74 views
3

我有一個使用Spring MVC和Thymeleaf的項目。 我需要根據他的偏好爲每個用戶顯示不同格式的日期。 例如,UserA希望顯示日期,如MM/dd/yyyy,UserB希望顯示日期,如dd/MM/yyyy。提交時出現錯誤的日期格式彈出窗體

要做到這一點,我用這個thymeleaf參數:

th:value="${#dates.format(myDate, dateFormat)}" 

值「日期格式」是根據用戶的喜好。這工作正常。

我的問題是,日期輸入是在一個窗體中,當我提交表單時,它不採取好的格式。我總是得到MM/dd/yyyy。

如果我選擇格式dd/MM/yyyy並輸入18/01/2016,在我的彈簧控制器中,我獲得了「2017年4月1日00:00:00 CEST 2017」,對應於01/06/2017的dd /月/年。

我能做些什麼來獲得我想要的格式的日期?

這裏是我的代碼:

<form th:action="@{/test}" th:object="${filter}" th:method="POST"> 
<input type="date" th:type="date" class="form-control" 
th:id="myDate" th:name="myDate" 
th:value="${#dates.format(filter.myDate, dateFormat)}" /> 
</form> 

控制器:

@RequestMapping(value = "/test", method = RequestMethod.POST) 
public String myTest(@ModelAttribute Filter filter, Model model) { 

    Systeme.out.println(model.dateFormat); 
    // dd/MM/yyyy 

    Systeme.out.println(filter.myDate.toString()); 
    // Thu Jun 01 00:00:00 CEST 2017 

    return "test"; 
} 
+0

任何參考?.... – deFreitas

回答

4

經過一天的研究,我發現Spring讀取Web請求中發送的值並嘗試將其與Filter對象綁定。

對於日期值,它除了用「MM/dd/yyyy」格式查找值之外。如果您以另一種格式發送值,則不起作用。

要解決此問題,可以使用註釋「InitBinder」。

@InitBinder 
private void dateBinder(WebDataBinder binder) { 
    //The date format to parse or output your dates 
    SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormat()); 
    //Create a new CustomDateEditor 
    CustomDateEditor editor = new CustomDateEditor(dateFormat, true); 
    //Register it as custom editor for the Date type 
    binder.registerCustomEditor(Date.class, editor); 
} 

該方法針對每個Web請求執行。在這裏,我調用我的「dateFormat()」方法來獲取用戶首選項中的格式,並告訴Spring它在Web請求中找到的所有java.util.Date都具有此格式。

這裏是我的全碼:

篩選:

import java.util.Date; 

@lombok.Data 
public class TestDateFilter { 
    private Date myDate; 

    public TestDateFilter() { 
     this.myDate = new Date(); 
    } 
} 

控制器:

@RequestMapping(value = "/testdate") 
public String testDate(Model model) { 
    model.addAttribute("filter", new TestDateFilter()); 
    return "testdate"; 
} 

@RequestMapping(value = "/testdate", method = RequestMethod.POST) 
public String testDatePost(@ModelAttribute("filter") TestDateFilter filter, Model model) { 
    System.out.printf(filter.getLoadingStartDate().toString()); 
    System.out.printf(dateFormat()); 
    return "testdate"; 
} 

@ModelAttribute("dateFormat") 
public String dateFormat() { 
    return userPreferenceService.getDateFormat(); 
} 

@InitBinder 
private void dateBinder(WebDataBinder binder) { 
    //The date format to parse or output your dates 
    SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormat()); 
    //Create a new CustomDateEditor 
    CustomDateEditor editor = new CustomDateEditor(dateFormat, true); 
    //Register it as custom editor for the Date type 
    binder.registerCustomEditor(Date.class, editor); 
} 

HTML:

<form th:action="@{/testdate}" th:object="${filter}" th:method="POST"> 
     <div class="row"> 
      <div class="col-xs-12 col-sm-6"> 
       <div class="input-group date"> 
        <input type="date" th:type="date" class="form-control" 
          th:id="loadingStartDate" th:name="loadingStartDate" 
          th:value="${#dates.format(filter.loadingStartDate, dateFormat)}" /> 
       </div> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="form-group"> 
       <div class="col-xs-12 col-sm-12"> 
        <button type="submit" class="btn btn-primary btn-lg pull-right"> 
         submit 
        </button> 
       </div> 
      </div> 
     </div> 
    </form> 
+0

我喜歡這個解決方案,因爲它允許我爲不同的區域設置不同的格式 –

1

我覺得有麻煩了,因爲春天不明白,輸入的值是一個日期。 您的變量myDate是java.util.Date類型的嗎?

如果是,嘗試註冊一個這樣的格式:

package your.pack.formatter; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 
import org.apache.commons.lang3.time.DateUtils; 
import org.springframework.format.Formatter; 

public class DateFormatter implements Formatter<Date> { 

    final String defaultDateFormat = "dd.MM.yyyy"; 

    @Override 
    public String print(Date object, Locale locale) { 
     return new SimpleDateFormat(defaultDateFormat).format(object); 
    } 

    @Override 
    public Date parse(String text, Locale locale) throws ParseException { 
     return DateUtils.parseDate(text, defaultDateFormat); 
    } 
} 

然後在你的配置寄存器是:

@Configuration 
public class ConversionServiceConfig extends WebMvcConfigurerAdapter { 

    @Bean 
    public DateFormatter dateFormatter() { 
     return new DateFormatter(); 
    } 

    @Override 
    public void addFormatters(FormatterRegistry registry) { 
     registry.addFormatter(dateFormatter()); 
    } 
} 

但我不知道如何使它動態工作原理你想...

用戶喜好存儲在數據庫或屬性?

+0

我的變量是一個java.util.Date和我的喜好存儲在數據庫中。在我的控制器中,我有一個使用「RequestMapping」的方法來調用服務來獲取首選項。我終於找到了使用「InitBinder」註釋的解決方案。 – YLombardi

3

您可以標註日期屬性

@DateTimeFormat(pattern = "dd/MM/yyyy") 
    private Date dob; 

沒有喬達依賴,因爲春季3.2

+0

@DateTimeFormat註解在Bean中爲我工作。這是最簡單的答案,真的有用! – mizerablebr