Java.sql.timestamp, LocalDate (java8) java.time biçimine nasıl dönüştürülür?


Yanıtlar:


196

Yapabilirsin:

timeStamp.toLocalDateTime().toLocalDate();

Dönüştürmeyi yapmak için saat dilimini timestamp.toLocalDateTime() kullanacağınıClock.systemDefaultZone() unutmayın . İstediğiniz bu olabilir veya olmayabilir.


1
Java 8'de eklendi.
assylias

54
Sadece bir not, timestamp.toLocalDateTime()yöntem, dönüşümü yapmak için systemDefault saat dilimini kullanacaktır. İstediğiniz bu olabilir veya olmayabilir.
jacobhyphenated

1
@jacobhyphenated lütfen yanıtı açık bir saat dilimi kullanarak gönderin. Teşekkürler!
user482745

@ jacobhyphenated'in yorumu burada son derece önemlidir, dolayısıyla buna verilen olumlu oyların sayısı. Ayrıntılar için
Ruslan

@jacobhyphenated, LocalDateTimeher zaman sistem varsayılan saat dilimini kullanır. Adında "Yerel" budur.
M Prokhorov

21

Kabul edilen cevap ideal değil, bu yüzden 2 sentimi eklemeye karar verdim

timeStamp.toLocalDateTime().toLocalDate();

genel olarak kötü bir çözüm bu yöntemi JDK'ya neden eklediklerinden emin değilim, çünkü sistem saat dilimini kullanarak örtük bir dönüştürme yaparak işleri gerçekten kafa karıştırıcı hale getiriyor. Genellikle sadece java8 tarih sınıflarını kullanırken, programcı iyi bir şey olan bir saat dilimi belirtmek zorunda kalır.

İyi çözüm şudur:

timestamp.toInstant().atZone(zoneId).toLocalDate()

Nerede BölgeKimliği genellikle hangi kullanmak istediğiniz zaman dilimi ya ZoneId.systemDefault () Eğer sistem dilimini veya bazı kodlanmış dilimini gibi kullanmak istiyorsanız ZoneOffset.UTC

Genel yaklaşım olmalıdır

  1. Doğrudan ilişkili bir sınıf kullanarak yeni java8 tarih sınıflarından kurtulun, örneğin bizim durumumuzda java.time.Instant doğrudan java.sql ile ilgilidir. , yani aralarında zaman dilimi dönüşümlerine gerek yoktur.
  2. Doğru şeyi yapmak için bu java8 sınıfındaki iyi tasarlanmış yöntemleri kullanın. Bizim durumumuzda atZone (zoneId) , bir dönüştürme yaptığımızı ve bunun için belirli bir saat dilimini kullandığımızı açıkça ortaya koydu.

1
Katılmıyorum. Zaman damgası (ve ayrıca Tarih) herhangi bir bölge bilgisine sahip değildir. LocalDate herhangi bir bölge bilgisine sahip olmadığından ikisi eşdeğerdir. Aralarında dönüşüm herhangi bir bölgeden bağımsız olarak yapılabilir. LocalDate'e dönüştürmeden önce ZonedDateTime'a dönüştürmek, bir saat dilimi ekler ve sonra onu tekrar kaldırır - bu şekilde yaparken, bulması zor bir hata almanız çok daha olasıdır.
AutomatedMike

5
@AutomatedMike Zaman Damgası (ve ayrıca Tarih) UTC'de zaman içinde bir noktayı temsil eder. LocalDate zamandaki bir noktayı değil, duvar saatinde görülen bir zamanı temsil eder. Lütfen javadoc'larını okuyun. "Aralarındaki dönüştürme herhangi bir bölgeden bağımsız olarak yapılabilir" - doğru değil , yeni Timestamp (0L) .toLocalDateTime (), Moskova saat dilimim için "1970-01-01T03: 00" döndürüyor. Sonuç, saat diliminiz için farklı olabilir.
Ruslan

1
@AutomatedMike toLocalDate () yaparak zamanı soysanız bile, Zaman Damgası gece yarısı gibi bir zamana sahipse günün yanlış olabileceğini kanıtlamak kolaydır, örneğin yeni Zaman Damgası (1000 * 60 * 60 * 23) .toLocalDateTime (). ToLocalDate (), UTC'de "1970-01-01" olduğunda, Moskova saat dilimim için "1970-01-02" döndürür.
Ruslan

1
@AutomatedMike "bir saat dilimi ekler ve sonra tekrar çıkarır" - esas nokta bir saat dilimi eklemek ve kaldırmak değil, bunun yerine açık bir saat dilimi kullanarak farklı kavramlar arasında dönüşüm yapmaktır. Bu, bir saat diliminin örtük olarak uygulandığı önceki iki yorumumun örnekleriyle çelişiyor .
Ruslan

7

Saat dilimini hesaba katmak için @assylias yanıtını biraz genişleteceğim. Belirli bir saat dilimi için LocalDateTime almanın en az iki yolu vardır.

Tüm uygulama için setDefault saat dilimini kullanabilirsiniz. Herhangi bir zaman damgası -> java.time dönüşümünden önce çağrılmalıdır:

public static void main(String... args) {
    TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
    TimeZone.setDefault(utcTimeZone);
    ...
    timestamp.toLocalDateTime().toLocalDate();
}

Veya toInstant.atZone zincirini kullanabilirsiniz:

timestamp.toInstant()
        .atZone(ZoneId.of("UTC"))
        .toLocalDate();
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.