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?


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);

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"));

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");

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);

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");

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();
}

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")


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 .


2

Prosta metoda:

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

    return dateRetour;
}

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.