Konwertowanie ciągu daty na obiekt DateTime przy użyciu biblioteki Joda Time

246

Mam datę jako ciąg znaków w następującym formacie "04/02/2011 20:27:05". Korzystam z biblioteki Joda-Time i chciałbym przekonwertować ją na DateTimeobiekt. Zrobiłem:

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

Ale pojawia się następujący błąd:

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

Jak przekonwertować powyższą datę na DateTimeobiekt?

Tomek
źródło
2
Dla każdego, kto tu przyjeżdża i szuka sposobu analizowania ciągów daty za pomocą java.timepakietu w Javie 8, spróbuj użyć LocalDateTime.parselub Instant.parse.
heenenee
1
Do Twojej wiadomości, projekt Joda-Time jest teraz w trybie konserwacji , a zespół doradza migrację do klas java.time . Zobacz samouczek Oracle .
Basil Bourque,

Odpowiedzi:

477

Użyj DateTimeFormat:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);
Bozho
źródło
2
Cześć, czy to możliwe, że formatyzator nie akceptuje stref czasowych? „ZZ” powraca „MEZ”, przy stosowaniu toStringfunkcji, ale nie można analizować z nim: Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". Czy to znany problem? Jak mogę tego uniknąć? Pozdrowienia.
Danyel
2
@Danyel: Możesz dodać strefy czasowe takie jak DateTimeFormat.forPattern („rrrr-MM-dd'T'HH: mm: ss.SSS'Z '”) .withLocale (Locale.ROOT) .withChronology (ISOChronology.getInstanceUTC ()) ;
Hyque
2
Otrzymuję nieprawidłowy format: „2014-11-04T17: 41: 52.000 + 01: 00” jest zniekształcony o „+01: 00” przy użyciu następującego formatyzatora: prywatny statyczny końcowy DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern („rrrr-MM- dd'T'HH: mm: ss.SSS'ZZ '"); DATE_TIME_FORMATTER.parseDateTime ((String) customSoftware.get (nagłówek [3])) w joda-time 2.2
Stephane
2
Po usunięciu pojedynczych cudzysłowów wokół ZZ zadziałało. Zastanawiam się, co oznaczają te pojedyncze cytaty ...
Stephane
2
@StephaneEybert (lub ktokolwiek inny) Pojedyncze cudzysłowy oznaczają, że coś jest dosłownym znakiem, którego należy się spodziewać w ciągu i nie należy go uważać za część wzorca. Na przykład: jeśli z jakiegoś powodu twoja data jest oznaczona jako „2015-08-dd30”, wpisz „rrrr-MM-'dd'dd”, wskazując, że pierwsza dd jest dosłowną częścią oczekiwaną w ciągu, a drugie dd (poza apostrofami) to właściwy dzień, który należy przeanalizować. Tak więc w twoim wcześniejszym przypadku zadziałałoby, gdyby zamiast rzeczywistej strefy czasowej wstawiłbyś „ZZ” na końcu swojego nadchodzącego ciągu datetime.
SadBunny
62

Wiem, że to stare pytanie, ale chciałem dodać, że od wersji JodaTime 2.0 możesz to zrobić za pomocą jednej linijki:

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));
stephen.hanson
źródło
3
Co powinienem umieścić w sekcji importowania?
Dmitry
20
DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");
Shawn Vader
źródło
7
Powinien być: DateTimeFormat.forPattern („dd / MM / rrrr GG: mm: ss”). ParseDateTime („04/02/2011 20:27:05”)
sufinawaz
16

Z komentarzy wybrałem odpowiedź podobną do dodania 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);
Ali Karaca
źródło
13

Twój format nie jest oczekiwanym formatem ISO, powinieneś spróbować

DateTimeFormatter format = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime time = format.parseDateTime("04/02/2011 20:27:05");
Karl-Bjørnar Øie
źródło
5

Możesz także użyć SimpleDateFormat , jak wDateTimeFormat

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
źródło
3
kirlisakal w tym przypadku nie, ale nie twórz współużytkowanej instancji SimpleDateFormat, ponieważ nie jest bezpieczna dla wątków, jeśli to zrobisz, to koszmar
dannrob
2
Do Twojej wiadomości, kłopotliwe stare klasy daty i czasu, takie jak java.util.Date, java.util.Calendari java.text.SimpleDateFormatsą już starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i Javę 9. Zobacz samouczek Oracle . A klasy java.time są bezpieczne dla wątków, w przeciwieństwie do klas starszych.
Basil Bourque,
3

Potrzebujesz DateTimeFormatter odpowiedniego dla używanego formatu. Przejrzyj dokumenty, aby uzyskać instrukcje, jak je zbudować.

Bez mankietu, myślę, że potrzebujesz format = DateTimeFormat.forPattern("M/d/y H:m:s")

Mark Tozzi
źródło
3

tl; dr

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

java.time

Nowoczesne podejście wykorzystuje klasy java.time, które zastępują czcigodny projekt Joda-Time .

Analizuj jako a, LocalDateTimeponieważ w danych wejściowych brakuje jakiegokolwiek wskaźnika strefy czasowej lub przesunięcia względem 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

Wskazówka: tam, gdzie to możliwe, użyj standardu ISO 8601 formatów , wymieniając wartości daty i godziny jako tekst, a nie format tutaj widoczny. Dogodnie, klasy java.time używają standardowych formatów podczas parsowania / generowania ciągów.


O java.time

Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date, Calendar, iSimpleDateFormat .

Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do java.time klas .

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Gdzie można uzyskać klasy java.time?

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval, YearWeek, YearQuarter, i więcej .

Basil Bourque
źródło
2

Prosta metoda:

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

    return dateRetour;
}
sissi49
źródło
0

Istnieją dwa sposoby, to może być osiągnięte .

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
Dulith De Costa
źródło
Oba są przestarzałe. Jest też nowoczesny sposób; jest w odpowiedzi Basil Bourque . Ponadto nie wnosisz niczego, co nie jest jeszcze zawarte w kilku innych odpowiedziach. A kiedy prosi się Jodę-Time, sugerowanie, że jeszcze dłużej przestarzałe i notorycznie kłopotliwe SimpleDateFormatjest złe, w mojej najbardziej uczciwej opinii.
Ole VV