Сохраните отформатированную строку в LocalDate

У меня DateConverter класс:

public class DateConverter extends StringConverter<LocalDate> {

    String pattern = "EEE, dd. MM. uuuu";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern,Locale.US);

    @Override
    public String toString(LocalDate object) {
        try {
            return formatter.format(object);
        } catch(Exception ex) {
            return "";
        }      
    }

    @Override
    public LocalDate fromString(String string) {
        try {
            return LocalDate.parse(string, formatter);
        } catch(Exception ex) {
            return null;
        }
    }

    public String getPattern(){
        return pattern;
    }

}

И у меня есть этот фрагмент кода:

allProd.forEach((prod) -> {
    DateConverter dc = new DateConverter();
    LocalDate onMarket = dc.fromString(dc.toString(prod.getOnMarket()));
    System.out.println("localdate:" + onMarket);
    System.out.println("string:"+dc.toString(onMarket));
}

Что печатает это:

localdate:2012-11-08
string:Thu, 08. 11. 2012
localdate:2011-11-13    
string:Sun, 13. 11. 2011
localdate:2002-04-11
string:Thu, 11. 04. 2002

Я хочу, чтобы мое значение LocalDate было отформатировано как строковое значение. Потому что у меня есть класс, в котором есть поле LocalDate, и поле всегда должно быть отформатировано. Поэтому я не хочу менять тип данных поля на строку.


person LolIPop65    schedule 04.01.2018    source источник
comment
Почему бы вам просто не вывести dc.toString(prod.getOnMarket()) в свой пример кода? Сама по себе дата не форматируется, это набор значений. Если вам нужно согласованное представление, вы можете сохранить отформатированную дату в поле String, а затем проанализировать это в ваших getDate() методах.   -  person daniu    schedule 04.01.2018
comment
@daniu Итак, вы предлагаете мне изменить тип данных на строку в моем классе?   -  person LolIPop65    schedule 04.01.2018
comment
Что вы имеете в виду под полем localdate и что поле всегда должно быть отформатировано? LocalDate имеет свою собственную внутреннюю структуру, вы видите в консоли то, как toString реализовано в LocalDate.   -  person J-Alex    schedule 04.01.2018
comment
@ LolIPop65 Нет, это единственный способ сохранить формат. Я предлагаю вам сохранить поле LocalDate и использовать свой DateTimeFormatter во всех местах, где вам нужно отображать дату.   -  person daniu    schedule 04.01.2018
comment
@ J-Alex, я понимаю. Я подумал, что могу изменить структуру localdate, чтобы при печати localdate она выглядела как строковое значение.   -  person LolIPop65    schedule 04.01.2018
comment
@daniu о, ладно. я понимаю   -  person LolIPop65    schedule 04.01.2018
comment
Вы можете создать свой собственный языковой стандарт, например, со страной, языком и настраиваемым вариантом. После Locale.setDefault использования MessageFormat и тому подобное должно работать. Однако потребовались некоторые эксперименты. LocalDate.toString никогда не будет работать.   -  person Joop Eggen    schedule 05.01.2018


Ответы (1)


Тебе нельзя. У LocalDate нет и не может быть формата.

Если вы будете придерживаться разделения модели и презентации, то формат даты тоже будет неправильно ставить. LocalDate - часть вашей модели (я полагаю). Формат EEE, dd. MM. uuuu принадлежит вашей презентации. Ваш конвертерный класс соединяет эти два понятия.

LocalDate содержит значение, дату в календаре и ничего больше. Примерно так же, как int хранит значение. Например, int может содержать значение 64458. Для представления вы можете отформатировать его в такие строки, как 000000064458, +64458 или 64,458, или даже 64458.00 или в шестнадцатеричном формате. int остается прежним. Таким же образом ваш LocalDate остается неизменным независимо от того, какие операции форматирования вы выполняете. Вы можете иметь желаемый формат только в String за пределами LocalDate.

В качестве компромисса вы можете поместить в свой класс getFormattedDate метод, который форматирует вашу дату в строку. Вы сами решаете, будет ли это слишком размывать разделение между моделью и презентацией, или, поскольку дата всегда должна быть отформатирована, в этом случае это приемлемо для вас.

person Ole V.V.    schedule 05.01.2018
comment
да, вы не можете форматировать фактические данные, но при просмотре вы можете ими манипулировать, но это не означает, что вы изменили фактические данные. - person Kandy; 05.01.2018