Java'da Farklı Biçimle Dizeyi Tarihe Göre Ayrıştırma


93

Ben dönüştürmek istediğiniz Stringiçin Datefarklı biçimlerde.

Örneğin,

Kullanıcıdan alıyorum

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

Bunu formatın fromDateDate nesnesi olarak dönüştürmek istiyorum"yyyy-MM-dd"

Bunu nasıl yapabilirim?


2
Bir Date nesnesinin biçimi yoktur, yalnızca tarihi temsil eden bir sayıdır. Tarih, "yyyy-MM-gg" biçimindeki bir Dize ile temsil edilebilir.
user85421

Yanıtlar:


182

Bir göz atın SimpleDateFormat. Kod şuna benzer:

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

1
string formatı almak yerine formatta çıktı alabilir miyim Date?
Rachel

4
@Rachel: Tabii, sadece kullan parseve devam etme format. parseBir Dize'yi bir Tarihe ayrıştırır.
Michael Myers

3
Ama parsebeni verir date formatolarak Fri Jan 06 00:01:00 EST 2012ancak ihtiyaç 2012-01-06tarih biçiminde
Rachel

1
@Rachel, çünkü System.out.println(anyDateObject)varsayılan toString () yöntemini çağırdığınızda, bu biçimde yazdırdığı söylenen yöntem, örn Fri Jan 06 00:01:00 EST 2012. İhtiyaçlarınıza uyması için onu geçersiz kılmanız gerekir.
KNU

3
Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time Java 8 ve Java 9. Bkz yerleşik sınıflara Öğreticisi Oracle tarafından .
Basil Bourque

14

tl; dr

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

Detaylar

İle diğer Cevapları java.util.Date, java.sql.Dateve SimpleDateFormatşimdi güncelliğini yitirmiş durumda.

LocalDate

Tarih-saat yapmanın modern yolu, özellikle java.time sınıflarıyla çalışmaktır LocalDate. LocalDateSınıf zaman günün-ve saat dilimi bulunmayan olmadan tarih salt değerini temsil eder.

DateTimeFormatter

Tarih-saat değerini temsil eden bir Stringi ayrıştırmak veya oluşturmak için DateTimeFormattersınıfı kullanın .

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

Bir tarih-saat nesnesini, değerini temsil eden bir Dize ile birleştirmeyin. Bir tarih-saat nesnesi vardır hiçbir biçimi String yapar iken,. Bir tarih zaman nesne, örneğin LocalDate, olabilir oluşturmak iç değeri göstermek için bir String, ancak tarihi zamanlı nesnesi ve dize ayrı ayrı nesnelerdir.

Bir String oluşturmak için herhangi bir özel format belirtebilirsiniz. Ya da java.time'ın otomatik olarak yerelleştirme işini yapmasına izin verin.

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

Konsola boşaltın.

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

ld: 2009-05-19 | çıktı: mardi 19 mai 2009

IdeOne.com'da iş başında görün .


Hakkında java.time

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar& SimpleDateFormat.

Şu anda bakım modunda olan Joda-Time projesi, java.time sınıflarına geçişi tavsiye ediyor .

Daha fazla bilgi edinmek için Oracle Eğitimi'ne bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya üstü ile uyumlu bir JDBC sürücüsü kullanın . Dizelere gerek yok, derslere gerek yok .java.sql.*

Java.time sınıflarını nereden edinebilirim?

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time uygulamasına gelecekteki olası eklemeler için kanıtlayıcı bir zemindir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


12

SimpleDateFormatSınıfı kullanın :

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

Kullanım:

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

Verimlilik için, biçimlendiricilerinizi bir karma haritada depolamak istersiniz. Hashmap, kullanım sınıfınızın statik bir üyesidir.

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

9
UYARI!! Fikir iyidir, ancak uygulama değildir. DateFormats, iş parçacığı açısından güvenli olmadıklarından statik olarak depolanmamalıdır! Birden fazla iş parçacığından kullanılıyorlarsa (ve bu statik açısından her zaman risklidir). FindBugs bunun için bir algılayıcı içerir (ısırıldıktan sonra başlangıçta katkıda bulundum . Bkz. Dschneller.blogspot.com/2007/04/… :-))
Daniel Schneller

Blog girişiniz ilginç bir okuma :-) Ya parseDate yönteminin kendisi senkronize edildiyse? Yine de sorun, muhtemelen kodu yavaşlatacak olması ...
Agora

1
ParseDate yöntemi haritaya erişen tek yöntem olduğu sürece, onu senkronize etmek işe yarayacaktır. Ancak bu - sizin de dediğiniz gibi - bir darboğaz yaratır.
Daniel Schneller

8

Bir dize tarihini java.sql.Date'e dönüştürme

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


3

SimpleDateFormatGerçekten ihtiyaçlarınız için işe yarayacak olsa da, ek olarak Java 7'de yeniden yapılan Tarih kütüphanesinin temelini oluşturan Joda Time'a da göz atmak isteyebilirsiniz. Çok kullanmamış olsam da, iyi şeyler dışında hiçbir şey duymadım. bu konuda ve projelerinizde tarihleri ​​yoğun bir şekilde manipüle ediyorsanız, muhtemelen incelemeye değer.


2

Bunun gibi bir dizeniz olduğunu varsayalım:

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

Şimdi bu Stringformatı Java ve Kotlin'de ayrı tarih ve saat olarak değiştirmek istiyoruz .

JAVA:

tarih çıkarmak için bir yöntemimiz var :

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 bu: 09/17/2019

Ve çıkarma zamanı için bir yöntemimiz var :

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

Returnbu: 10:56

KOTLIN:

tarih çıkarmak için bir fonksiyonumuz var :

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 bu: 09/17/2019

Ve çıkarma zamanı için bir yöntemimiz var :

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!!)
}

Returnbu: 10:56


Lütfen gençlere uzun zamandır modası geçmiş ve herkesin bildiği gibi sorunlu SimpleDateFormatsınıfı kullanmayı öğretmeyin . En azından ilk seçenek olarak değil. Ve herhangi bir çekincesiz değil. Bugün java.time, modern Java tarih ve saat API'sinde ve onun DateTimeFormatter. Ayrıca SimpleDateFormatsaniyede (mikrosaniye) 6 ondalık sayı doğru şekilde ayrıştırılamaz.
Ole VV

İkinci snippet'inizi çalıştırdığımda, söylediğiniz gibi değil 10:56 AM, onun yerine 11:09 AM(Oracle jdk-11.0.3 üzerinde test edilmiştir).
Ole VV

@ OleV.V. , Eğer bir yöntemin modası çoktan geçmişse, üzerinde bir işaret olarak bir çizgi ile kullanımdan kaldırılacaktır, eğer bir yöntem veya sınıf kullanımdan kaldırılmamışsa onu kullanabiliriz, en iyi yol olduğunu söylemiyorum, belki daha iyi bir yolumuz var ama bu şekilde basit ve anlaşılır, eğer bir yöntem ya da sınıf eskiyse, bunun zahmetli olması için hiçbir neden yoktur ve kullanmamız DateTimeFormatteriçin minsdk 26ya da daha fazlasına ihtiyacımız var o zaman bu iyi değil
milad salimi

@ OleV.V. Ama yorumunuz ve ikinci yorumunuz için teşekkürler, iki uygulamada birçok kez kontrol 10:56 AM
ettiğimi

1
@ OleV.V. , Tamam ama hiçbir yolum olmadığında veya bu API (kitaplık) kodumdan çok daha iyi olduğunda bir kitaplık kullanıyorum, çünkü bir kitaplık eklediğinizde projenize kullanılamayabilecek bazı kodlar eklersiniz ve bu sizin için aşırı yüktür. proje, bu benim yaklaşımım ve yaklaşımınız benim için saygın.
milad salimi

1

Bir tarihi biçimlendirmenin ve dizeye dönüştürmenin basit yolu

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

çıktı: gg / aa / gg biçiminde tarih: 21/10/2015


1

Bir Datenesnenin formatı yoktur , bir temsilidir. Tarih, Stringistediğiniz formatta a ile sunulabilir .

Örneğin " yyyy-MM-dd", " yy-MMM-dd", " dd-MMM-yy" vb.

Bunu başarmak için, SimpleDateFormat

Bunu dene,

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

Bu çıktı: 2009-05-19

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.