Альтернативы Java 6 для LocalDate и DateTimeFormatter

В проекте Java 8 я могу проанализировать дату следующим образом:

LocalDate.parse(
    newDateString, 
    DateTimeFormatter.ofPattern(expectedDateFormat) 
)
.format(
    DateTimeFormatter.ofPattern(expectedDBDateFormat)
);

Моя проблема в том, что у меня есть проект Java 6, а LocalDate и DateTimeFormatter не определены для Java 6.

Как я могу разобрать дату в моем проекте Java 6?


person user880386    schedule 15.05.2018    source источник
comment
Просто используйте внешнюю библиотеку, например joda time   -  person YCF_L    schedule 15.05.2018
comment
SimpleDateFormat   -  person a_horse_with_no_name    schedule 15.05.2018
comment
Согласен с @YCF_L. Используйте joda.org/joda-time, чтобы получить безопасную для trhead библиотеку для работы с датами для Ява 6   -  person Ivan    schedule 15.05.2018
comment
Возможный дубликат Convert java.util.Date to String   -  person Petter Friberg    schedule 15.05.2018
comment
также связанные Изменить формат даты в строке Java, и если вы хотите используйте Joda время Joda: как преобразовать String в LocalDate?   -  person Petter Friberg    schedule 15.05.2018
comment
Когда у нас есть ThreeTen Backport для Java 6 и 7, я понятия не имею, почему кто-то упоминает старые и устаревшие варианты, такие как Joda-Time или хуже, Date и печально известный неприятный SimpleDateFormat. К счастью, пара ответов дала правильный ответ.   -  person Ole V.V.    schedule 15.05.2018
comment
Как правило, вам не следует форматировать дату в строку для вашей базы данных. Лучше передать объект даты в ваш подготовленный оператор или реализацию JPA, и он вставит значение даты в ваш столбец типа данных date. Обычно вы можете передать LocalDate напрямую. К сожалению, с Java 6 вам нужно дать java.sql.Date, но преобразование простое: DateTimeUtils.toSqlDate(yourLocalDate).   -  person Ole V.V.    schedule 15.05.2018
comment
@ОлеВ.В. Я согласен с вами и с Андреа, лучше использовать ThreeTen-Backport, также для пользователя 880386 просто примите ответ Адреаса, это лучше, чем я, не стыдно говорить правду;)   -  person YCF_L    schedule 15.05.2018


Ответы (4)


Я хотел бы использовать время Joda, вы можете просто внести некоторые изменения в свой код, код должен выглядеть так:

LocalDate.parse(
     newDateString, DateTimeFormat.forPattern(expectedDateFormat)
).toString(DateTimeFormat.forPattern(expectedDBDateFormat));

Импорт

Импорт должен быть:

import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;

Вместо :

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

Имена методов

Если вы заметили, что есть небольшие изменения:

In Java 8 Time                            In Joda Time 
ofPattern(String pattern)           =>    forPattern(String pattern)   
format(DateTimeFormatter format)    =>    toString(DateTimeFormat format)
person YCF_L    schedule 15.05.2018
comment
Ok. Я попробую. он также будет работать с java7? Большое спасибо - person user880386; 15.05.2018
comment
Как упоминалось в моем ответе, в некоторых случаях также необходимо изменить синтаксис шаблона. - person Meno Hochschild; 15.05.2018
comment
Поскольку Joda-Time рекомендует начиная с Java SE 8 и далее, пользователей просят перейти на java.time (JSR-310), не лучше ли для новых проектов Java 6/7 использовать ThreeTen-Backport? Методы и схемы останутся прежними. Во всяком случае, это то, что я рекомендую. - person Andreas; 15.05.2018

Есть 3 основных варианта:

  • Используйте ThreeTen-Backport (рекомендуется)
    Преимущество: в основном тот же API, что и Java 8 Time API (JSR-310). Миграция на Java 8 очень проста.
    Недостаток: Имена пакетов другие, и это не полная реализация JSR-310.

    import org.threeten.bp.LocalDate;
    import org.threeten.bp.format.DateTimeFormatter;
    
    LocalDate.parse(input, DateTimeFormatter.ofPattern(inputFormat))
             .format(DateTimeFormatter.ofPattern(outputFormat));
    
  • Используйте Joda-Time
    Преимущество: работает с любой версией Java.
    Недостаток: устарело, в пользу Java 8 Time API (JSR-310).

    import org.joda.time.LocalDate;
    import org.joda.time.format.DateTimeFormat;
    
    LocalDate.parse(input, DateTimeFormat.forPattern(inputFormat))
             .toString(DateTimeFormat.forPattern(outputFormat));
    
  • Используйте Java 6 Date и SimpleDateFormat
    Преимущество: будет работать для всех будущих Java-версии. Нет сторонней библиотеки.
    Недостаток: API несовершенен, поэтому был создан Java 8 Time API (JSR-310).

    import java.text.SimpleDateFormat;
    
    new SimpleDateFormat(outputFormat).format(
        new SimpleDateFormat(inputFormat).parse(input));
    

Для сравнения, ваш код Java 8:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

LocalDate.parse(input, DateTimeFormatter.ofPattern(inputFormat))
         .format(DateTimeFormatter.ofPattern(outputFormat));
person Andreas    schedule 15.05.2018
comment
это мило @Andreas +1 - person YCF_L; 15.05.2018
comment
Я предлагаю изменить порядок ваших заготовок, поместив рекомендуемый маршрут вверху. - person Basil Bourque; 16.05.2018
comment
Согласен. Буллит должен быть рекомендован в первую очередь - person ONE; 13.09.2019

java.time-API имеет бэкпорт, работающий для Java 6 или 7. Так что я думаю, что это самый простой подход с минимальными изменениями.

Другие ответы также защищали Joda-Time, но основным недостатком является изменение синтаксиса шаблона формата, поэтому необходимо больше, чем просто изменение операторов импорта или замена конструкторов фабричными методами.

Наконец (для полноты), есть также моя библиотека Time4J (v3.x для Java 6), которая содержит альтернативный механизм синтаксического анализа/форматирования, основанный на классе ChronoFormatter (и эквивалентном PlainDate вместо LocalDate).

person Meno Hochschild    schedule 15.05.2018
comment
мило @Мено Хохшильд +1 - person YCF_L; 15.05.2018

В vanilla Java 6 вы можете использовать тип Date и класс SimpleDateFormat для синтаксического анализа строк/форматов, представленных датами.

SimpleDateFormat parser = new SimpleDateFormat(expectedDateFormat);
Date date = parser.parse(input);
SimpleDateFormat formatter = new SimpleDateFormat(expectedDBDateFormat);
String formattedDate = formatter.format(date);

Как упоминалось в других ответах, у обоих классов есть свои проблемы, поэтому они были заменены API даты/времени с Java 8. Предпочитайте один из этих вариантов или лучше, но избегайте хранения дат в строковом формате в базе данных.

person butchyyyy    schedule 15.05.2018
comment
Привет, butchyyyy, и добро пожаловать в Stack Overflow! Ответы только на код обычно не рекомендуются в Stack Overflow, возможно, поэтому кто-то проголосовал за ваш ответ. Не могли бы вы добавить объяснение на английском языке о том, как/почему ваш код решает проблему? Спасибо! - person Max von Hippel; 15.05.2018