LocalDate'i LocalDateTime veya java.sql.Timestamp'a dönüştürün


126

JodaTime 1.6.2 kullanıyorum.

Bir var LocalDatebir (Joda) birine dönüştürmek gerektiğini LocalDateTime, ya da java.sqlTimestampormapping için.

Bunun nedeni, a LocalDateTimeve a arasında nasıl dönüşüm yapılacağını bulmuş olmamdır java.sql.Timestamp:

LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));

Yani, LocalDateve arasında LocalDateTimedönüşüm yapabilirsem, devam eden dönüşümü yapabilirim java.sql.Timestamp. Doğru yöndeki tüm dürtüler için teşekkürler!


Bilginize, Joda-Time projesi şu anda bakım modunda ve ekip java.time sınıflarına geçişi tavsiye ediyor . Oracle'ın Eğitimi bölümüne bakın . Ayrıca, java.sql.Timestampsınıf artık miras olup, java.time sınıfları, özellikle Instant.
Basil Bourque

Yanıtlar:


270

JodaTime

JodaTime en dönüştürmek için org.joda.time.LocalDateiçin java.sql.Timestamp, sadece yap

Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());

JodaTime en dönüştürmek için org.joda.time.LocalDateTimeiçin java.sql.Timestamp, sadece yap

Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());

JavaTime

Java8 en dönüştürmek için java.time.LocalDateiçin java.sql.Timestamp, sadece yap

Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());

Java8 en dönüştürmek için java.time.LocalDateTimeiçin java.sql.Timestamp, sadece yap

Timestamp timestamp = Timestamp.valueOf(localDateTime);

Tüm URL'ler geçerli olmadığı LocalDateTimeiçin dönüştürürken dikkatli olun . Kaynak: joda-time.sourceforge.net/faq.html#illegalinstant ve sadece bununla karşılaşıyorum . DateTimeLocalDateTimeDateTime
Christophe De Troyer

valueOf () bir dizeyi kabul ettiğinden bağımsız değişkende derleme hatası aldım.
Yurtsever

@Patriotic: Bu sadece Java SE 1.8 veya daha yenisini kullanmıyorsanız gerçekleşir. Cevapta ve Javadoc'a verilen bağlantılarda belirtildiği gibi (yukarıdaki cevaptaki mavi metinler aslında bağlantılardır, Javadoc'a gitmek için üzerlerine tıklayabilirsiniz), Timestamp#valueOf()yöntem Java SE 1.8 de a LocalDateTime.
BalusC

60

Java 8 time API kullanmanın en iyi yolu:

  LocalDateTime ldt = timeStamp.toLocalDateTime();
  Timestamp ts = Timestamp.valueOf(ldt);

Modelinizle birlikte yerleştirilen JPA ile kullanım için ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa ):

@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime ldt) {
        return Timestamp.valueOf(ldt);
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp ts) {
        return ts.toLocalDateTime();
    }
}

Yani şimdi göreceli zaman diliminden bağımsız zamandır. Ek olarak şunları yapmak kolaydır:

  LocalDate ld = ldt.toLocalDate();
  LocalTime lt = ldt.toLocalTime();

Biçimlendirme:

 DateTimeFormatter DATE_TME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
 String str = ldt.format(DATE_TME_FORMATTER);
 ldt = LocalDateTime.parse(str, DATE_TME_FORMATTER);

GÜNCELLEME: postgres 9.4.1208, HSQLDB 2.4.0 vb. Herhangi bir konuşma olmadan Java 8 Time API'yi anlar!


17

tl; Dr.

Joda-Time projesi artık supplanted bakım modunda olduğu java.time sınıfları.

  • Sadecejava.time.Instant sınıfı kullanın .
  • İhtiyaç yok:
    • LocalDateTime
    • java.sql.Timestamp
    • Teller

Geçerli anı UTC olarak yakalayın.

Instant.now()  

O anı veritabanında saklamak için:

myPreparedStatement.setObject(  , Instant.now() )  // Writes an `Instant` to database.

O anı veri tabanından almak için:

myResultSet.getObject(  , Instant.class )  // Instantiates a `Instant`

Duvar saatini belirli bir zaman dilimine ayarlamak için.

instant.atZone( z )  // Instantiates a `ZonedDateTime`

LocalDateTime yanlış sınıf

Diğer Cevaplar doğrudur, ancak LocalDateTimeamacınız için yanlış sınıf olduğunu belirtmekte başarısız olurlar .

İkisinde de java.time ve Joda-Time , bir LocalDateTimekasten herhangi bir zaman diliminde kavramını ya yoksun ofset-den-UTC. Böyle olunca yok değil bir an temsil eder ve olduğu değil çizelgesinde bir nokta. A , yaklaşık 26-27 saatlik bir aralıktaki potansiyel anlar LocalDateTimehakkında kaba bir fikri temsil eder .

Bir kullan LocalDateTimeiçin ya ofset bölge / (değil iyi bir durum) bilinmemektedir veya bölge-ofset zaman belirsiz olduğunda. Örneğin, "Noel 25 Aralık 2018’in ilk anında başlıyor", bir LocalDateTime.

ZonedDateTimeBelirli bir saat dilimindeki bir anı temsil etmek için a kullanın . Örneğin, Noel gibi belirli bir bölgede başlar Pacific/Aucklandveya America/Montrealbir ZonedDateTimenesneyle temsil edilir .

Bir an için her zaman UTC'de kullanın Instant.

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

Bir saat dilimi uygulayın. Aynı an, zaman çizelgesinde aynı nokta, ancak farklı bir duvar saati ile görüntülendi.

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;  // Same moment, different wall-clock time.

Yani, LocalDate ve LocalDateTime arasında dönüşüm yapabilirsem,

Hayır, yanlış strateji. Yalnızca tarih değeriniz varsa ve tarih-saat değeri istiyorsanız, günün saatini belirtmelisiniz. Bu günün saati belirli bir bölge için o tarihte geçerli olmayabilir - bu durumda ZonedDateTimesınıf, günün saatini gerektiği gibi otomatik olarak ayarlar.

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ;  // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

Günün ilk anını günün saati olarak istiyorsanız, bırakın java.time o anı belirlesin . Günün 00: 00: 00'da başladığını varsaymayın. Yaz Saati Uygulaması (DST) gibi anormallikler, günün 01:00:00 gibi başka bir saatte başlayabileceği anlamına gelir.

ZonedDateTime zdt = ld.atStartOfDay( z ) ;

java.sql.Timestamp yanlış sınıf

java.sql.TimestampTamamen supplanted şimdi eski olan zahmetli eski tarih-saat sınıfların bir parçasıdır java.time sınıfları. Bu sınıf, UTC'de nanosaniye çözünürlükte bir anı temsil etmek için kullanıldı . Bu amaca artık hizmet ediliyor java.time.Instant.

JDBC 4.2, getObject/setObject

İtibariyle JDBC 4.2 ve üstü, senin JDBC sürücüsü doğrudan java.time arayarak veritabanı ile nesneleri alışverişi yapabilir:

Örneğin:

myPreparedStatement.setObject(  , instant ) ;

… ve …

Instant instant = myResultSet.getObject(  , Instant.class ) ;

Mirası, moderni dönüştür

Henüz java.time ile güncellenmemiş eski kodla arayüz yapmanız gerekiyorsa , eski sınıflara eklenen yeni yöntemleri kullanarak ileri geri dönüştürün.

Instant instant = myJavaSqlTimestamp.toInstant() ;  // Going from legacy class to modern class.

…ve…

java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ;  // Going from modern class to legacy class.

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 derslerini 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 .


5

Saat diliminize bağlı olarak birkaç dakika kaybedebilirsiniz (1650-01-01 00:00:00, 1649-12-31 23:52:58 olur)

Bunu önlemek için aşağıdaki kodu kullanın

new Timestamp(localDateTime.getYear() - 1900, localDateTime.getMonthOfYear() - 1, localDateTime.getDayOfMonth(), localDateTime.getHourOfDay(), localDateTime.getMinuteOfHour(), localDateTime.getSecondOfMinute(), fractional);

3

Joda soluklaştığından, birisi Java 8'e dönüştürmek LocaltDateisteyebilir LocalDateTime. Java 8'de, ve kullanarak bir örnek LocalDateTimeoluşturmanın bir yolunu verecektir . Burayı kontrol edin .LocalDateTimeLocalDateLocalTime

public statik LocalDateTime of (LocalDate tarihi, LocalTime saati)

Örnek,

    // just to create a sample LocalDate
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
    LocalDate ld = LocalDate.parse("20180306", dtf);

    // convert ld into a LocalDateTime
    // We need to specify the LocalTime component here as well, it can be any accepted value
    LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

Sadece referans için, aşağıdaki çağ saniyelerini elde etmek için kullanılabilir,

    ZoneId zoneId = ZoneId.systemDefault();
    long epoch = ldt.atZone(zoneId).toEpochSecond(); 

    // If you only care about UTC
    long epochUTC = ldt.toEpochSecond(ZoneOffset.UTC);

Burada hiç kullanmaya gerek yok LocalDateTime. Bu sınıf, kasıtlı olarak herhangi bir zaman dilimi veya UTC'den uzaklık kavramından yoksundur. Yani burada yararlı bir amaca hizmet etmiyor. Bunun yerine: LocalDate.parse( “20180306” , DateTimeFormatter.BASIC_ISO_DATE ).atStartOfDay( ZoneId.of( “Africa/Tunis” ).toEpochSecond()Günün her zaman böyle değil, 00: 00'da başladığını varsaymayın.
Basil Bourque

Günün 00.00'da başladığını varsaymakla neyi kastediyorsun
prime

1
Gibi Anomaliler Yaz Saati (DST) ortalama böyle 01:00:00 olarak gün başka bir zamanda başlayabilir bazı yerlerde bazı tarihler üzerinde. Öyleyse, varsaymak yerine, java.time'ınjava.time.LocalDate.atStartOfDay a almak için çağırarak ilk anı belirlemesine izin verinZonedDateTime . Örneklere bakın benim Yanıt . Söylediğim gibi, LocalDateTimesınıf tüm bunlarda işe yaramaz ve verimsizdir.
Basil Bourque

Yani LocalDateTimebir kullanmalıyız ZoneId?
asal

Sanırım tüm puanlarımı kaçırdın. Cevabımı bu sayfada tekrar oku. Daha fazla örnek ve tartışmadan daha fazlasını öğrenmek için Stack Overflow'da arama yapın. Ama burada son kez söyleyeceğim: LocalDateTimeedilir değil burada eldeki probleme benimsedikleri görülmüştür. Bir LocalDateTimegelmez değil bir an temsil eder. Bir LocalDateTimesahiptir hiçbir şey herhangi bir yerellik ile ilgisi bu sınıfın niyet ve ayrıntıları hakkında daha fazla bilgi edinmek - adı ilk bakışta aksi ima olsa veya zaman diliminde. LocalDateTimeSınıfı bu Soru görülen amaca bir amaca hizmet, ama değil.
Basil Bourque

2

işlev çağrısı asStartOfDay()ile ilgili java.time.LocalDatenesnenin bir döner java.time.LocalDateTimenesne


0

Java8 +

import java.time.Instant;
Instant.now().getEpochSecond(); //timestamp in seconds format (int)
Instant.now().toEpochMilli(); // timestamp in milliseconds format (long)

Yararlı, ama soruyu gerçekten cevaplamıyor gibi.
Ole VV

Kod için teşekkürler ama soruyla hiçbir ilgisi yok.
refaelio
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.