Преобразование строки даты в объект DateTime с использованием библиотеки Joda Time

246

У меня есть дата в виде строки в следующем формате "04/02/2011 20:27:05". Я использую библиотеку Joda-Time и хотел бы преобразовать ее в DateTimeобъект. Я сделал:

DateTime dt = new DateTime("04/02/2011 20:27:05")

Но я получаю следующую ошибку:

Invalid format: "04/02/2011 14:42:17" is malformed at "/02/2011 14:42:17"

Как преобразовать указанную дату в DateTimeобъект?

Том
источник
2
Для тех, кто прибывает сюда, ищет способы анализа строк даты с помощью java.timeпакета в Java 8, попробуйте использовать LocalDateTime.parseили Instant.parse.
Женя
1
К вашему сведению, проект Joda-Time в настоящее время находится в режиме обслуживания , и команда советует перейти на классы java.time . Смотрите Учебник по Oracle .
Василий Бурк

Ответы:

477

Используйте DateTimeFormat:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);
Bozho
источник
2
Привет, возможно, что форматировщик не принимает часовые пояса? «ZZ» возвращает «МЭЗ», при применении toStringфункции, но я не могу разобрать из него: Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". Это известная проблема? Как я могу избежать этого? С уважением.
Даниэль
2
@Danyel: Вы можете добавить часовые пояса, такие как DateTimeFormat.forPattern ("гггг-ММ-дд'Т'ХХ: мм: сс.ССС'Z '") .withLocale (Locale.ROOT) .withChronology (ISOChronology.getInstanceUTC ()) ;
Hyque
2
Я получаю неверный формат: «2014-11-04T17: 41: 52.000 + 01: 00» искажен в «+01: 00» со следующим форматером: частный статический окончательный DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern ("гггг-MM- dd'T'HH: мм: ss.SSS'ZZ ' "); DATE_TIME_FORMATTER.parseDateTime ((String) customSoftware.get (header [3])) в период времени 2,2
Стефан
2
После удаления одинарных кавычек вокруг ZZ все заработало. Интересно, что означают эти одиночные кавычки ...
Стефан
2
@StephaneEybert (или кто-либо еще). Одинарные кавычки означают, что что-то является буквальным символом, ожидаемым в строке, и не должно рассматриваться как часть шаблона. Например: если ваша дата по какой-либо причине указывается как «2015-08-dd30», вы должны указать «yyyy-MM-'dd'dd», указывая, что первый dd является литеральной частью, ожидаемой в строке, и Второй дд (вне апострофов) - фактический день, который нужно проанализировать. Так что в вашем предыдущем случае это сработало бы, если бы вместо фактического часового пояса вы поставили бы «ZZ» в конце вашей входящей строки datetime.
SadBunny
62

Я знаю, что это старый вопрос, но я хотел бы добавить, что в JodaTime 2.0 вы можете сделать это с помощью одной строки:

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));
stephen.hanson
источник
3
Что я должен положить в раздел импорта?
Дмитрий
20
DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");
Шон Вейдер
источник
7
Должно быть: DateTimeFormat.forPattern ("дд / мм / гггг ЧЧ: мм: сс"). ParseDateTime ("02.04.2011 20:27:05")
sufinawaz
16

Из комментариев я выбрал ответ, а также добавив TimeZone:

String dateTime = "2015-07-18T13:32:56.971-0400";

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        .withLocale(Locale.ROOT)
        .withChronology(ISOChronology.getInstanceUTC());

DateTime dt = formatter.parseDateTime(dateTime);
Али Карака
источник
13

Ваш формат не соответствует ожидаемому формату ISO, вам следует попробовать

DateTimeFormatter format = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime time = format.parseDateTime("04/02/2011 20:27:05");
Карл-Бьернар
источник
5

Вы также можете использовать SimpleDateFormat , как вDateTimeFormat

Date startDate = null;
Date endDate = null;
try {
    if (validDateStart!= null) startDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateStart + " " + validDateStartTime);
    if (validDateEnd!= null) endDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateEnd + " " + validDateEndTime);
} catch (ParseException e) {
    e.printStackTrace();
}
efirat
источник
3
В этом случае kirlisakal этого не делает, но не создавайте совместно используемый экземпляр SimpleDateFormat, так как он не
ориентирован на многопотоковое исполнение.
2
К вашему сведению, проблемные старые классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormatтеперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и Java 9. См. Руководство Oracle . И классы java.time являются поточно-ориентированными, в отличие от устаревших классов.
Василий Бурк
3

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

С манжеты, думаю, тебе нужно format = DateTimeFormat.forPattern("M/d/y H:m:s")

Марк Тоцци
источник
3

ТЛ; др

java.time.LocalDateTime.parse( 
    "04/02/2011 20:27:05" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" )
)

java.time

Современный подход использует классы java.time, которые вытесняют почтенную Joda-Time .

Анализировать как, LocalDateTimeпоскольку в вашем входе отсутствует индикатор часового пояса или смещения от UTC.

String input = "04/02/2011 20:27:05" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString (): 2011-02-04T20: 27: 05

Совет: Где возможно, используйте стандартные форматы ISO 8601 при обмене значениями даты и времени в виде текста, а не в формате, представленном здесь. Для удобства, классы java.time используют стандартные форматы при разборе / генерации строк.


О java.time

Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date, Calendar, и SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где взять классы java.time?

  • Java SE 8 , Java SE 9 и более поздние
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
  • Android

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval, YearWeek, YearQuarter, и более .

Базилик Бурк
источник
2

Простой метод:

public static DateTime transfStringToDateTime(String dateParam, Session session) throws NotesException {
    DateTime dateRetour;
    dateRetour = session.createDateTime(dateParam);                 

    return dateRetour;
}
sissi49
источник
0

Это может быть достигнуто двумя способами .

DateTimeFormat

DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

SimpleDateFormat

        String dateValue = "04/02/2011 20:27:05";
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); //  04/02/2011 20:27:05

        Date date = sdf.parse(dateValue); // returns date object
        System.out.println(date); // outputs: Fri Feb 04 20:27:05 IST 2011
Дулит Де Коста
источник
Оба терма устарели. Существует также современный способ; это в ответе Василия Бурка . Также вы не вносите ничего, чего не было в других ответах. И когда спрашивают о Joda-Time, предполагать, что даже более устаревшие и печально известные проблемы SimpleDateFormat- это плохо, по моему мнению.
Оле В.В.