Mengonversi string tanggal ke objek DateTime menggunakan perpustakaan Joda Time


246

Saya memiliki tanggal sebagai string dalam format berikut "04/02/2011 20:27:05". Saya menggunakan perpustakaan Joda-Time dan ingin mengubahnya menjadi DateTimeobjek. Aku melakukannya:

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

Tapi saya mendapatkan kesalahan berikut:

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

Bagaimana cara mengubah tanggal di atas menjadi DateTimeobjek?


2
Bagi siapa pun yang tiba di sini mencari cara mengurai String tanggal menggunakan java.timepaket di Java 8, coba gunakan LocalDateTime.parseatau Instant.parse.
heenenee

1
FYI, proyek Joda-Time sekarang dalam mode pemeliharaan , dengan tim menyarankan migrasi ke kelas java.time . Lihat Tutorial oleh Oracle .
Basil Bourque

Jawaban:


477

Gunakan DateTimeFormat:

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

2
Hai, mungkinkah formatter tidak menerima zona waktu? "zz" kembali "MEZ", ketika menerapkan toStringfungsi, tapi aku tidak bisa mengurai dari itu: Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". Apakah ini masalah yang diketahui? Bagaimana saya bisa menghindarinya? Salam.
Danyel

2
@ Saluran: Anda dapat menambahkan zona waktu seperti DateTimeFormat.forPattern ini ("yyyy-MM-dd'T'HH: mm: ss.SSS'Z '") .withLocale (Locale.ROOT) .withChronology (ISOChronology.getInstanceUTC ()) ;
Hyque

2
Saya mendapatkan format yang tidak valid: "2014-11-04T17: 41: 52.000 + 01: 00" salah format di "+01: 00" dengan formatter berikut: final static pribadi DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern ("yyyy-MM- dd'T'HH: mm: ss.SSS'ZZ '"); DATE_TIME_FORMATTER.parseDateTime ((String) customSoftware.get (header [3])) pada joda-time 2.2
Stephane

2
Setelah menghapus tanda kutip tunggal di sekitar ZZ itu berhasil. Saya ingin tahu apa arti kutipan tunggal ini ...
Stephane

2
@StephaneEybert (atau siapa pun) Kutipan tunggal berarti bahwa sesuatu adalah karakter literal yang diharapkan dalam string, dan tidak dianggap sebagai bagian dari pola. Misalnya: jika tanggal Anda datang sebagai "2015-08-dd30" karena beberapa alasan, Anda akan menentukan "yyyy-MM-'dd'dd", yang menunjukkan bahwa dd pertama adalah bagian literal yang diharapkan dalam string, dan dd kedua (di luar apostrof) adalah hari sebenarnya yang perlu diurai. Jadi dalam kasus Anda sebelumnya itu akan bekerja jika alih-alih zona waktu yang sebenarnya Anda akan meletakkan "ZZ" di akhir datetime-string yang masuk.
SadBunny

62

Saya tahu ini adalah pertanyaan lama, tetapi saya ingin menambahkan bahwa, pada JodaTime 2.0, Anda dapat melakukan ini dengan satu-baris:

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

3
Apa yang harus saya masukkan ke bagian impor?
Dmitry

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

7
Harus: DateTimeFormat.forPattern ("dd / MM / yyyy HH: mm: ss"). ParseDateTime ("04/02/2011 20:27:05")
sufinawaz

16

Dari komentar saya memilih jawaban suka dan juga menambahkan 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

Format Anda bukan format ISO yang diharapkan, Anda harus mencoba

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

5

Anda juga dapat menggunakan SimpleDateFormat , seperti padaDateTimeFormat

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 tidak dalam hal ini, tetapi jangan membuat contoh bersama dari SimpleDateFormat karena tidak aman untuk thread, itu adalah mimpi buruk untuk di-debug jika Anda melakukannya
dannrob

2
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle . Dan kelas java.time adalah thread-safe, tidak seperti kelas legacy.
Basil Bourque

3

Anda memerlukan DateTimeFormatter yang sesuai dengan format yang Anda gunakan. Lihatlah dokumentasi untuk instruksi tentang cara membangunnya.

Tidak perlu, saya pikir Anda perlu 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" )
)

waktu java

Pendekatan modern menggunakan kelas java.time yang menggantikan proyek Joda-Time yang terhormat .

Parsing sebagai LocalDateTimeinput Anda tidak memiliki indikator zona waktu atau offset-dari-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

Tip: Jika memungkinkan, gunakan format ISO 8601 standar saat bertukar nilai tanggal sebagai teks daripada format yang terlihat di sini. Dengan mudah, kelas java.time menggunakan format standar saat parsing / menghasilkan string.


Tentang java.time

The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date, Calendar, & SimpleDateFormat.

Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .

Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .

Di mana mendapatkan kelas java.time?

Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .


2

Metode sederhana:

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

    return dateRetour;
}

0

Ada dua cara ini bisa dicapai .

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

Therm keduanya kedaluwarsa. Ada juga cara modern; itu ada dalam jawaban oleh Basil Bourque . Anda juga tidak berkontribusi apa pun yang belum ada di beberapa jawaban lain. Dan ketika Joda-Time diminta, menyarankan yang bahkan lebih lama usang dan merepotkan SimpleDateFormatitu buruk menurut pendapat saya yang paling jujur.
Ole VV
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.