it-roy-ru.com

Как отформатировать объект 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
}
4
MOZAKATAK

Правка: Учитывая ваши изменения, просто установите parsedDate равным вашей отформатированной текстовой строке, например так:

parsedDate = text;

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

DateTimeFormatter formatters = DateTimeFormatter.ofPattern("d/MM/uuuu");
String text = date.format(formatters);
14
Rebecca Close

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

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

Представление String (созданное toString()) является международным стандартом для печати дат. Если вы хотите другой формат, вы должны использовать DateTimeFormatter по вашему выбору.

3
Joe C

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

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));
}
3
Wojciech Kazior

Это могло бы быть возможно, если бы вы могли расширить LocalDate и переопределить метод toString(), но класс LocalDate является неизменным и, следовательно, (secure oop) final. Это означает, что если вы хотите использовать этот класс, то единственный метод 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, но это может вызвать больше проблем, чем решит!

0
George Siggouroglou