Перетворення рядка дати в об'єкт DateTime за допомогою бібліотеки часу Joda


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.
heenenee

1
FYI, проект Joda-Time зараз перебуває в режимі обслуговування , команда радить перейти до класів java.time . Дивіться Підручник від Oracle .
Василь Бурк

Відповіді:


477

Використання DateTimeFormat:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);

2
Привіт, чи можливо формат не сприймає часові пояси? «ZZ» повертає «ОЕЗ», при застосуванні toStringфункції, але я не можу розібрати з нього: Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". Це відоме питання? Як я можу цього уникнути? З повагою
Даніель

2
@Danyel: Ви можете додати часові пояси на зразок цієї DateTimeFormat.forPattern ("yyyy-MM-dd'T'HH: mm: ss.SSS'Z '") .withLocale (Locale.ROOT) .whChronology (ISOChronology.getInstanceUTC ()) ;
Hyque

2
Я отримую недійсний формат: "2014-11-04T17: 41: 52.000 + 01: 00" неправильно формується у "+01: 00" із таким форматом: приватний статичний кінцевий DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern ("yyyy-MM- dd'T'HH: мм: ss.SSS'ZZ '"); DATE_TIME_FORMATTER.parseDateTime ((String) customSoftware.get (заголовок [3])) в joda-time 2.2
Стефан

2
Після вилучення єдиних лапок навколо ZZ він працював. Цікаво, що означають ці одиничні цитати ...
Стефан

2
@StephaneEybert (або хто-небудь інший) Одиночні цитати означають, що щось є буквальним символом, який слід очікувати в рядку, і його не слід вважати частиною шаблону. Наприклад: якщо ваша дата чомусь входить як "2015-08-dd30", ви вкажете "yyyy-MM-'dd'dd", вказуючи, що перший dd - це буквальна частина, яка очікується в рядку, і другий дд (поза апострофами) - це фактичний день, який потрібно проаналізувати. Отже, у вашому попередньому випадку це спрацювало, якби замість фактичного часового поясу ви поставили "ZZ" наприкінці вхідного строку дата, що надходить.
SadBunny

62

Я знаю, що це давнє запитання, але я хотів додати, що, як для JodaTime 2.0, ви можете це зробити за допомогою одного вкладиша:

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));

3
Що потрібно поставити до розділу імпорту?
Дмитро

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

7
Має бути: DateTimeFormat.forPattern ("dd / MM / yyyy HH: mm: ss"). ParseDateTime ("02.02.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();
}

3
kirlisakal не в цьому випадку, але не створюйте спільний екземпляр SimpleDateFormat, оскільки він не є безпечним для потоків, це кошмар для налагодження, якщо ви це зробите
dannrob

2
FYI, тривожні старі класи дату, такі як 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 . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .

Де отримати класи java.time?

Проект 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;
}

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, на мою найчеснішу думку це погано .
Оле ВВ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.