Tarih dizesini Joda Time kitaplığını kullanarak DateTime nesnesine dönüştürme


246

Aşağıdaki biçimde bir dize olarak bir tarih var "04/02/2011 20:27:05". Joda-Time kütüphanesini kullanıyorum ve onu DateTimenesneye dönüştürmek istiyorum . Yaptım:

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

Ama şu hatayı alıyorum:

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

Yukarıdaki tarihi bir DateTimenesneye nasıl dönüştürebilirim ?


2
Buraya gelen herkes için java.timeJava 8'deki paketi kullanarak tarih Dizelerini nasıl ayrıştırılacağını arayanlar için LocalDateTime.parseveya kullanmayı deneyin Instant.parse.
heenenee

1
FYI, Joda-Time projesi şu anda bakım modunda ve ekip java.time sınıflarına geçişi tavsiye ediyor . Oracle'ın Öğreticisine bakın .
Basil Bourque

Yanıtlar:


477

Kullanım DateTimeFormat:

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

2
Merhaba, biçimlendiricinin zaman dilimlerini kabul etmemesi mümkün mü? "zz" döner "MEZ", uygularken toStringişlev, ama ondan ayrıştıramadı: Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". Bu bilinen bir sorun mu? Nasıl önleyebilirim? Saygılarımızla.
Danyel

2
@Danyel: Bu DateTimeFormat.forPattern ("yyyy-MM-dd'T'HH: mm: ss.SSS'Z '") .withLocale (Locale.ROOT) .withChronology (ISOChronology.getInstanceUTC ()) gibi zaman dilimleri ekleyebilirsiniz. ;
Nisan'ta Hyque

2
Geçersiz bir biçim alıyorum: "2014-11-04T17: 41: 52.000 + 01: 00" şu biçimlendiriciyle "+01: 00" biçiminde hatalı biçimlendirildi: private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern ("yyyy-MM- gg'T'SS: dd: ss.SSS'ZZ ' "); Joda-time 2.2'de DATE_TIME_FORMATTER.parseDateTime ((String) customSoftware.get (başlık [3]))
Stephane

2
ZZ çevresindeki tek tırnakları kaldırdıktan sonra çalıştı. Bu tek tırnakların ne anlama geldiğini merak ediyorum ...
Stephane

2
@StephaneEybert (veya başka herhangi biri) Tek tırnak, bir şeyin dizede beklenen gerçek bir karakter olduğu ve desenin bir parçası olarak kabul edilmeyeceği anlamına gelir. Örneğin: tarihiniz herhangi bir nedenle "2015-08-dd30" olarak gelirse, "yyyy-AA-'dd'dd" belirtir ve ilk dd'nin dizede beklenen bir değişmez kısım olduğunu ve ikinci gg (kesme işaretlerinin dışında) ayrıştırılması gereken gerçek gündür. Dolayısıyla, önceki durumunuzda, gerçek saat dilimi yerine, gelen datetime-string'inizin sonuna "ZZ" koyarsanız çalışırdı.
SadBunny

62

Bu eski bir soru olduğunu biliyorum, ama eklemek istiyorum, JodaTime 2.0 itibariyle, bunu bir astar ile yapabilirsiniz:

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

3
İçe aktarma bölümüne ne koymalıyım?
Dmitry

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

7
Olmalıdır: DateTimeFormat.forPattern ("gg / AA / yyyy SS: dd: ss"). ParseDateTime ("04/02/2011 20:27:05")
sufinawaz

16

Yorumlardan şöyle bir cevap aldım ve TimeZone'u ekledim:

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

Biçiminiz beklenen ISO biçimi değil, denemelisiniz

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

5

Ayrıca kullanabilirsiniz SimpleDateFormat olduğu gibiDateTimeFormat

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 bu durumda değil, ancak iş parçacığı için güvenli olmadığı için bir SimpleDateFormat'ın paylaşılan bir örneğini oluşturmayın, bunu yaparsanız hata ayıklamak bir kabus
dannrob

2
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 Oracle tarafından Öğreticisi . Ve java.time sınıfları, eski sınıfların aksine, iş parçacığı için güvenlidir.
Basil Bourque


3

tl; Dr.

java.time.LocalDateTime.parse( 
    "04/02/2011 20:27:05" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" )
)

java.time

Modern yaklaşım, saygıdeğer Joda-Time projesini tamamlayan java.time sınıflarını kullanıyor .

Girişiniz LocalDateTime, saat dilimi veya UTC'den sapma göstergesinden yoksun olarak a olarak ayrıştırın .

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

İpucu: Mümkünse, tarih-saat değerlerini burada görülen biçim yerine metin olarak değiştirirken standart ISO 8601 biçimlerini kullanın . Uygun bir şekilde, java.time sınıfları, dizeleri ayrıştırırken / oluştururken standart formatları kullanır.


Java.time hakkında

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.

Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .

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

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

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


2

Basit bir yöntem:

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

    return dateRetour;
}

0

Bunun başarılması için iki yol vardır .

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

Her ikisi de term modası geçmiş. Modern bir yol da var; İçinde Basil Bourgue tarafından cevap . Ayrıca, başka birkaç cevapta bulunmayan hiçbir şeye katkıda bulunmuyorsunuz. Ve Joda-Time istendiğinde, daha da eski ve kötü şöhretli bir şekilde zahmetli SimpleDateFormatolduğunu öne sürmek en dürüst görüşüme göre kötüdür .
Ole VV
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.