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.