Как отформатировать объект LocalDate в MM / dd / yyyy и сохранить формат

Я читаю текст и сохраняю даты как переменные LocalDate.

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

РЕДАКТИРОВАТЬ: я хочу, чтобы parsedDate хранился в правильном формате 25/09/2016, а не печатался как строка

Мой код:

public static void main(String[] args) 
{
    LocalDate date = LocalDate.now();
    DateTimeFormatter formatters = DateTimeFormatter.ofPattern("d/MM/uuuu");
    String text = date.format(formatters);
    LocalDate parsedDate = LocalDate.parse(text, formatters);

    System.out.println("date: " + date); // date: 2016-09-25
    System.out.println("Text format " + text); // Text format 25/09/2016
    System.out.println("parsedDate: " + parsedDate); // parsedDate: 2016-09-25

    // I want the LocalDate parsedDate to be stored as 25/09/2016
}

person MOZAKATAK    schedule 25.09.2016    source источник
comment
Объект LocalDate не имеет формата - он сам по себе не может помнить, что он должен быть в определенном формате, таком как MM/dd/yyyy.   -  person Jesper    schedule 25.09.2016


Ответы (5)


РЕДАКТИРОВАТЬ: Учитывая ваше редактирование, просто установите parsedDate равным вашей отформатированной текстовой строке, например:

parsedDate = text;

Объект LocalDate можно распечатать только в формате ISO8601 (гггг-ММ-дд). Чтобы напечатать объект в каком-либо другом формате, вам необходимо отформатировать его и сохранить LocalDate в виде строки, как вы продемонстрировали в своем собственном примере.

DateTimeFormatter formatters = DateTimeFormatter.ofPattern("d/MM/uuuu");
String text = date.format(formatters);
person Rebecca Close    schedule 25.09.2016
comment
cannot convert from String to LocalDate ошибка при выполнении этого задания - person MOZAKATAK; 25.09.2016
comment
Простите, parsedDate должен быть строкой, чтобы ее можно было сохранить в этом формате. Поэтому вам нужно будет определить parsedDate как строку. - person Rebecca Close; 25.09.2016
comment
Итак, нет другого формата, который может принимать переменная LocalDate, кроме yyyy-MM-dd, если вы не сохраните его вместо этого как String? Спасибо - person MOZAKATAK; 25.09.2016
comment
Нет, см. Ответ Джо Си! Может быть, это объяснит вещи лучше - person Rebecca Close; 25.09.2016

Просто отформатируйте дату при ее распечатке:

public static void main(String[] args) {
    LocalDate date = LocalDate.now();
    DateTimeFormatter formatters = DateTimeFormatter.ofPattern("d/MM/uuuu");
    String text = date.format(formatters);
    LocalDate parsedDate = LocalDate.parse(text, formatters);

    System.out.println("date: " + date);
    System.out.println("Text format " + text);
    System.out.println("parsedDate: " + parsedDate.format(formatters));
}
person Wojciech Kazior    schedule 25.09.2016

Короткий ответ: нет.

Длинный ответ: LocalDate - это объект, представляющий год, месяц и день, и это три поля, которые он будет содержать. У него нет формата, потому что разные языковые стандарты будут иметь разные форматы, и это затруднит выполнение операций, которые можно было бы выполнить с LocalDate (например, сложение или вычитание дней или сложение времени).

Строковое представление (созданное toString()) - это международный стандарт печати дат. Если вам нужен другой формат, вы должны использовать DateTimeFormatter по вашему выбору.

person Joe C    schedule 25.09.2016

Нет, вы не можете сохранить формат, потому что вы не можете переопределить toString для LocalDate (конструктор LocalDate является частным, он не может быть расширен), и нет метода для постоянного изменения формата в LocalDate.

Возможно, вы могли бы создать новый класс и использовать статический метод для изменения формата, но вы всегда должны использовать MyLocalDate.myToString (localDate) вместо localDate.toString (), когда вам нужен другой формат.

 public class MyLocalDate {
    
    public static String myToString(LocalDate localDate){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
        return localDate.format(formatter);
    }   
}

Когда вы вызываете, вы должны использовать этот способ

FechaInicioTextField.setText(MyLocalDate.myToString(fechaFacturaInicial));

вместо того

FechaInicioTextField.setText(fechaFacturaInicial.toString());
person Ignacio Marín Reyes    schedule 04.08.2020

Это могло бы быть возможным, если бы вы могли расширить LocalDate и переопределить метод toString(), но класс LocalDate является неизменным и, следовательно, (безопасный oop) окончательным. Это означает, что если вы хотите использовать этот класс, единственный toString() метод, который вы сможете использовать, это приведенный выше (скопирован из источников LocalDate):

@Override
public String toString() {
    int yearValue = year;
    int monthValue = month;
    int dayValue = day;
    int absYear = Math.abs(yearValue);
    StringBuilder buf = new StringBuilder(10);
    if (absYear < 1000) {
        if (yearValue < 0) {
            buf.append(yearValue - 10000).deleteCharAt(1);
        } else {
            buf.append(yearValue + 10000).deleteCharAt(0);
        }
    } else {
        if (yearValue > 9999) {
            buf.append('+');
        }
        buf.append(yearValue);
    }
    return buf.append(monthValue < 10 ? "-0" : "-")
        .append(monthValue)
        .append(dayValue < 10 ? "-0" : "-")
        .append(dayValue)
        .toString();
}

Если вы должны переопределить это поведение, вы можете установить флажок LocalDate и использовать свой собственный toString метод, но это может вызвать больше проблем, чем решить!

person George Siggouroglou    schedule 29.06.2017