Soru Java'da Farklı Biçimle Tarihin Dize Ayrıştırması


Dönüştürmek istiyorum String için Date farklı formatlarda.

Örneğin,

Ben kullanıcıdan alıyorum

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

Bunu dönüştürmek istiyorum fromDate Tarih nesnesi olarak "yyyy-MM-dd" biçim

Bunu nasıl yapabilirim?


76
2018-05-19 12:22


Menşei


Bir Date nesnesinin biçimi yoktur, sadece tarihi temsil eden bir sayıdır. Tarih, "yyyy-MM-dd" biçimindeki bir Dize ile temsil edilebilir. - Carlos Heuberger


Cevaplar:


Şuna baksana SimpleDateFormat. Kod böyle bir şey gider:

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

159
2018-05-19 12:31



string formatı almak yerine çıktı alabilir miyim Date biçim? - Rachel
@Rachel: Tabii, sadece kullan parse ve gitme format. parse bir Dizeyi bir Tarih'e ayrıştırır. - Michael Myers♦
Fakat parse bana verir date format gibi Fri Jan 06 00:01:00 EST 2012 ama buna ihtiyaç var 2012-01-06 tarih formatı - Rachel
@Rachel, aradığınızda System.out.println(anyDateObject) bu formatta yazdırmak için söylenen varsayılan toString () yöntemi çağrılır, örn. Fri Jan 06 00:01:00 EST 2012. İhtiyaçlarınıza göre geçersiz kılmanız gerekiyor. - KNU
FYI, zahmetli eski tarih-zaman sınıfları gibi java.util.Date, java.util.Calendar, ve java.text.SimpleDateFormat şimdi mirastarafından java.time Java 8 ve Java 9'da yerleşik sınıflar. Bkz. Eğitimi Oracle tarafından. - Basil Bourque


Kullan SimpleDateFormat sınıf:

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 hashmap'de saklamak 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);
}

12
2018-05-19 12:31



UYARI!! Fikir iyi, ama uygulama değil. DateFormats, statik olarak depolanmamalıdır, çünkü bunlar iş parçacığı güvenli değildir! Birden fazla iş parçacığından kullanılırlarsa (ve bu durum istatistiklerle her zaman risklidir). FindBugs bunun için bir dedektör içerir (ben ısırıldıktan sonra ilk başta katkıda bulunduğum). dschneller.blogspot.com/2007/04/... :-)) - Daniel Schneller
Blog girişiniz enteresan bir okunuş :-) :-) ParseDate-metodunun kendisi senkronize edilirse ne olur? Sorun, muhtemelen kodu yavaşlatmasıdır ... - Agora
ParseDate yöntemi haritaya erişen tek yöntem olduğu sürece, senkronize etmek işe yarayacaktır. Ancak bu, söylediğiniz gibi, bir darboğaz getirecektir. - Daniel Schneller


Javadocs’a bakın java.text.SimpleDateFormat İhtiyacınız olan her şeyi açıklar.


7
2018-05-19 12:28





Bir dize tarihini java.sql.Date dosyasına 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

7
2017-08-21 07:01





tl; Dr.

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

ayrıntılar

Diğer Cevaplar java.util.Date, java.sql.Date, ve SimpleDateFormat şimdi modası geçmiş.

LocalDate

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

DateTimeFormatter

Bir tarih-saat değerini temsil eden bir Dizeyi ayrıştırmak veya üretmek için DateTimeFormatter sınıf.

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

Bir tarih-saat nesnesini değerini temsil eden bir String ile karıştırmayın. Bir tarih-zaman nesnesi vardır yok hayır biçimBir String ise. Gibi bir tarih-saat nesnesi LocalDate, can üretmek İç değerini göstermek için bir String, ancak tarih-saat ve String ayrı ayrı nesnelerdir.

Bir String oluşturmak için herhangi bir özel format belirtebilirsiniz. Veya java.time otomatik olarak yerelleştirme işini yapalım.

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

Konsola git.

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

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

IdeOne.com'da eyleme bakın.


hakkında java.time

java.time çerçeve Java 8 ve daha sonra yerleşiktir. Bu dersler sıkıntılı eskileri destekliyor miras gibi tarih-saat sınıfları java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time proje, şimdi Bakım Modu, geçişi önerir java.time sınıflar.

Daha fazla bilgi için bkz. Oracle Eğitimi. Ve birçok örnek ve açıklamalar için Stack Overflow'u arayın. Şartname JSR 310.

Değişebilir java.time doğrudan veritabanınızla nesneler. Kullanın JDBC sürücüsü ile uyumlu JDBC 4.2 veya daha sonra. Dizelere gerek yok, gerek yok java.sql.* sınıflar.

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

ThreeTen-Ekstra Proje java.time ek sınıfları ile genişletir. Bu proje java.time için gelecekteki olası eklemeler için kanıtlanmış bir zemin. Burada bazı yararlı sınıflar bulabilirsiniz. Interval, YearWeek, YearQuarter, ve Daha.


7
2017-10-26 00:18





Süre SimpleDateFormat gerçekten ihtiyaçlarınız için çalışacak, ayrıca kontrol etmek isteyebilirsiniz Joda zamanıBu, Java 7'deki yeniden yayımlanmış Tarih kitaplığının temelini oluşturuyor. Ben çok fazla kullanmadığım halde, bununla ilgili güzel şeyler duymadım ve eğer projelerinizde çok yoğun bir şekilde değişiklik yapıyorsanız, muhtemelen buna değer. içine.


3
2018-05-19 12:45



Joda iyidir! Yuppi! - Steve McLeod


Bir tarihi biçimlendirmek ve dizeye dönüştürmek için basit bir yol

    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ı: dd / aa / gg biçimindeki tarih: 21/10/2015


1
2017-10-21 05:35