Parse String to Date dengan Format Berbeda di Java

93

Saya ingin mengonversi Stringke Datedalam format yang berbeda.

Sebagai contoh,

Saya mendapatkan dari pengguna,

String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format

Saya ingin mengonversinya fromDatesebagai "yyyy-MM-dd"format objek Tanggal

Bagaimana saya bisa melakukan ini?

Gnaniyar Zubair
sumber
2
Objek Tanggal tidak memiliki format, itu hanya angka yang mewakili tanggal. Tanggal dapat diwakili oleh String dengan format "yyyy-MM-dd".
pengguna85421

Jawaban:

182

Coba lihat SimpleDateFormat. Kode berjalan seperti ini:

SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

try {

    String reformattedStr = myFormat.format(fromUser.parse(inputString));
} catch (ParseException e) {
    e.printStackTrace();
}
Michael Myers
sumber
1
Alih-alih mendapatkan format string, bisakah saya mendapatkan output dalam Dateformat?
Rachel
4
@ Rachel: Tentu, gunakan saja parsedan jangan lanjutkan format. parsemem-parsing String menjadi Date.
Michael Myers
3
Tetapi parseberikan saya date formatsebagaimana Fri Jan 06 00:01:00 EST 2012yang diperlukan dalam 2012-01-06format tanggal
Rachel
1
@Rachel itu karena ketika Anda memanggil System.out.println(anyDateObject)metode toString () default yang disebut akan mencetak dalam format itu misalnya Fri Jan 06 00:01:00 EST 2012. Anda perlu menggantinya agar sesuai dengan kebutuhan Anda.
KNU
3
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 .
Basil Bourque
14

tl; dr

LocalDate.parse( 
    "19/05/2009" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
)

Detail

Jawaban lain dengan java.util.Date, java.sql.Date, dan SimpleDateFormatsekarang ketinggalan jaman.

LocalDate

Cara modern untuk melakukan tanggal-waktu adalah bekerja dengan kelas java.time, khususnya LocalDate. The LocalDatekelas mewakili nilai tanggal-hanya tanpa waktu-of-hari dan tanpa zona waktu.

DateTimeFormatter

Untuk mengurai, atau menghasilkan, String yang mewakili nilai tanggal-waktu, gunakan DateTimeFormatterkelas.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "19/05/2009" , f );

Jangan menggabungkan objek tanggal-waktu dengan String yang mewakili nilainya. Objek tanggal-waktu tidak memiliki format , sedangkan String tidak. Objek tanggal-waktu, seperti LocalDate, dapat menghasilkan String untuk mewakili nilai internalnya, tetapi objek tanggal-waktu dan String adalah objek terpisah yang terpisah.

Anda dapat menentukan format kustom apa pun untuk menghasilkan String. Atau biarkan java.time melakukan pelokalan otomatis.

DateTimeFormatter f = 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
                     .withLocale( Locale.CANADA_FRENCH ) ;
String output = ld.format( f );

Buang ke konsol.

System.out.println( "ld: " + ld + " | output: " + output );

ld: 2009-05-19 | keluaran: mardi 19 mai 2009

Lihat aksinya di IdeOne.com .


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. Spesifikasinya adalah JSR 310 .

Anda dapat bertukar objek java.time langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu string, tidak perlu java.sql.*kelas.

Dimana mendapatkan kelas java.time?

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

Basil Bourque
sumber
12

Gunakan SimpleDateFormatkelas:

private Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = new SimpleDateFormat(format);
    return formatter.parse(date);
}

Pemakaian:

Date date = parseDate("19/05/2009", "dd/MM/yyyy");

Untuk efisiensi, Anda ingin menyimpan pemformat Anda dalam sebuah peta hash. Hashmap adalah anggota statis kelas util Anda.

private static Map<String, SimpleDateFormat> hashFormatters = new HashMap<String, SimpleDateFormat>();

public static Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = hashFormatters.get(format);

    if (formatter == null)
    {
        formatter = new SimpleDateFormat(format);
        hashFormatters.put(format, formatter);
    }

    return formatter.parse(date);
}
Agora
sumber
9
CAVEAT !! Idenya bagus, tapi implementasinya tidak. DateFormats tidak boleh disimpan secara statis, karena mereka tidak aman untuk thread! Jika digunakan lebih dari satu utas (dan ini selalu berisiko dengan statika). FindBugs berisi detektor untuk ini (yang kebetulan saya berkontribusi pada awalnya, setelah saya digigit. Lihat dschneller.blogspot.com/2007/04/… :-))
Daniel Schneller
Entri blog Anda adalah bacaan yang menarik :-) Bagaimana jika metode parseDate itu sendiri saya sinkronkan? Masalahnya adalah hal itu mungkin akan memperlambat kode ...
Agora
1
Selama metode parseDate adalah satu-satunya metode yang mengakses peta, menyinkronkannya akan berhasil. Namun hal ini - seperti yang Anda katakan - menimbulkan hambatan.
Daniel Schneller
8

Ubah tanggal string menjadi java.sql.Date

String fromDate = "19/05/2009";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date dtt = df.parse(fromDate);
java.sql.Date ds = new java.sql.Date(dtt.getTime());
System.out.println(ds);//Mon Jul 05 00:00:00 IST 2010
Ritesh Kaushik
sumber
3

Meskipun SimpleDateFormatmemang akan berfungsi untuk kebutuhan Anda, selain itu Anda mungkin ingin memeriksa Joda Time , yang tampaknya merupakan dasar untuk perpustakaan Tanggal ulang di Java 7. Meskipun saya belum sering menggunakannya, saya tidak mendengar apa pun selain hal-hal yang baik tentang hal itu dan jika Anda memanipulasi tanggal secara ekstensif dalam proyek Anda, itu mungkin layak untuk dilihat.

James McMahon
sumber
2

Misalkan Anda memiliki string seperti ini:

String mDate="2019-09-17T10:56:07.827088"

Sekarang kami ingin mengubah Stringformat ini memisahkan tanggal dan waktu di Java dan Kotlin .

JAWA:

kami memiliki metode untuk tanggal ekstrak :

public String getDate() {
    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mDate);
        dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Return apakah ini: 09/17/2019

Dan kami memiliki metode untuk waktu ekstrak :

public String getTime() {

    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mCreatedAt);
        dateFormat = new SimpleDateFormat("h:mm a", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

ReturnApakah ini: 10:56 AM

KOTLIN:

kami memiliki fungsi untuk mengekstrak tanggal :

fun getDate(): String? {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val date = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.US)
    return dateFormat.format(date!!)
}

Return apakah ini: 09/17/2019

Dan kami memiliki metode untuk waktu ekstrak :

fun getTime(): String {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val time = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("h:mm a", Locale.US)
    return dateFormat.format(time!!)
}

ReturnApakah ini: 10:56 AM

milad salimi
sumber
Tolong jangan ajarkan yang muda untuk menggunakan kelas yang sudah lama usang dan terkenal merepotkan SimpleDateFormat. Setidaknya bukan sebagai opsi pertama. Dan bukan tanpa syarat apapun. Hari ini kami memiliki jauh lebih baik java.time, API tanggal dan waktu Java modern, dan DateTimeFormatter. Juga SimpleDateFormattidak dapat mengurai 6 desimal pada detik (mikrodetik) dengan benar.
Ole VV
Ketika saya menjalankan cuplikan kedua Anda, saya tidak mendapatkan 10:56 AMseperti yang Anda katakan, tetapi sebaliknya 11:09 AM(diuji pada Oracle jdk-11.0.3).
Ole VV
@ OleV.V. , Jika suatu metode sudah lama ketinggalan zaman, itu akan usang dengan garis di atasnya sebagai tanda, jika metode atau kelas tidak digunakan lagi kita dapat menggunakannya, saya tidak mengatakan itu adalah cara terbaik, mungkin kita memiliki cara yang lebih baik tetapi cara ini sederhana dan dapat dimengerti, jika sebuah metode atau kelas sudah tua tidak ada alasan bahwa itu merepotkan dan untuk penggunaan DateTimeFormatterkita perlu minsdk 26atau lebih tinggi maka itu tidak baik
milad salimi
@ OleV.V. Tapi terima kasih atas komentar Anda dan tentang komentar kedua Anda, saya dapat mengatakan bahwa saya memeriksanya berkali-kali dalam dua aplikasi dan kembali10:56 AM
milad salimi
1
@ OleV.V. , Ok tapi saya menggunakan perpustakaan ketika saya tidak punya cara atau API (perpustakaan) itu sangat sangat baik daripada kode saya, karena ketika Anda menambahkan perpustakaan Anda menambahkan beberapa kode ke proyek Anda yang mungkin tidak digunakan dan ini berlebihan untuk Anda proyek, ini adalah pendekatan saya dan pendekatan Anda terhormat bagi saya.
milad salimi
1

Cara sederhana untuk memformat tanggal dan mengubahnya menjadi string

    Date date= new Date();

    String dateStr=String.format("%td/%tm/%tY", date,date,date);

    System.out.println("Date with format of dd/mm/dd: "+dateStr);

keluaran: Tanggal dengan format dd / mm / dd: 21/10/2015

Khalid Habib
sumber
1

Sebuah Dateobjek memiliki tidak ada format , itu adalah representasi. Tanggal dapat disajikan Stringdengan format yang Anda suka .

Misalnya " yyyy-MM-dd", " yy-MMM-dd", " dd-MMM-yy" dan lain-lain.

Untuk mencapai ini, Anda bisa menggunakan file SimpleDateFormat

Coba ini,

        String inputString = "19/05/2009"; // i.e. (dd/MM/yyyy) format

        SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy"); 
        SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Date dateFromUser = fromUser.parse(inputString); // Parse it to the exisitng date pattern and return Date type
            String dateMyFormat = myFormat.format(dateFromUser); // format it to the date pattern you prefer
            System.out.println(dateMyFormat); // outputs : 2009-05-19

        } catch (ParseException e) {
            e.printStackTrace();
        }

Output ini: 2009-05-19

Dulith De Costa
sumber