Java.time.LocalDate öğesini java.util.Date türüne dönüştür


372

Ben dönüştürmek istediğiniz java.time.LocalDateiçine java.util.Datetürü. Çünkü tarihi ayarlamak istiyorum JDateChooser. Veya java.timetarihleri destekleyen herhangi bir tarih seçici var mı?



2
LGoodDatePicker yerel olarak java.time paketini kullanır (Java 8 time veya JSR-310 olarak da bilinir . Özellikle LGoodDatePicker, tarih değerlerini saklamak için bir "java.time.LocalDate" kullanır. Ekran görüntüleri ve bir demo Proje Ana Sayfasındadır .
BlakeTNC

Yanıtlar:


560
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

Tarih seçicinizin tarihleri ​​dizelere dönüştürmek için sistem varsayılan saat dilimini kullandığını varsayar.


JB Nizet belki de Java 8 geliştirme / sürümünün erken bir aşamasındaydı ve @ user3509494 bunu bir şekilde test ediyordu.
russellhoff

2
atStartOfDay()Anladığım gibi, tarihin değerini değiştirdiğinden kaçınmak mümkün mü ?
yegor256

1
Cevabınız bana pek mantıklı gelmiyor, bu yüzden açıklığa kavuşturmaya karar verdim. Neden işe yaramaz yorum yapmak yerine açıklığa kavuşturmuyorsun?
yegor256

12
Çünkü bunun nasıl ve neden açıklığa ihtiyacı olacağını anlamıyorum. 232 kişi bu cevabı iptal etti, böylece net buldu. AtStartOfDay, tarihin değerini değiştirdiğini söylüyorsunuz. Bu mantıklı değil. atStartOfDay, javadoc'un söylediklerini yapar: bir LocalDate'i aynı tarihte ve günün başında bir LocalDateTime'a dönüştürür.
JB Nizet

2
@cornz Sonuçlarınızın yanlış olduğundan emin misiniz? Almanya'daysanız, Nisan 1893'te Almanya'daki 6 dakikalık 32 saniyelik aksaklık ile ilgili bir şey olabilir. Bazı ayrıntılar için timeanddate.com/time/zone/germany/berlin?syear=1850 adresine bakın. .
Dawood ibn Kareem

104

İşte yeni java.timesınıfları java.util.Datenesnelere dönüştürmek için kullandığım bir yardımcı sınıf :

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class DateUtils {

  public static Date asDate(LocalDate localDate) {
    return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
  }

  public static Date asDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  }

  public static LocalDate asLocalDate(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
  }

  public static LocalDateTime asLocalDateTime(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
  }
}

@Oliv yorumuna göre düzenlendi.


ZoneId.systemDefault()Sorunlu değil çünkü zaman kuşakları yıl boyunca değişiyor. 01-Ocak günü saat diliminde -05: 00 (ortada), ancak 01-Temmuz günü saat diliminde -06: 00 (merkezi gün ışığı) gün ışığından tasarruf nedeniyle yanlış sonuçlara neden olmazsa zaman?
jhilden

94

java.sql.Date.valueOf()Yöntemi şu şekilde kullanabilirsiniz :

Date date = java.sql.Date.valueOf(localDate);

Zaman ve saat dilimi bilgilerinin buraya eklenmesine gerek yoktur, çünkü bunlar dolaylı olarak alınır.
Bkz. LocalDate - java.util.Date ve tersi en basit dönüşüm?


Bu benim için mükemmeldi, çünkü ihtiyacım olan şey LocalDate'i SQL'e geçirmekti. Ancak, Tarih biçimlendiriciniz tarihi biçimlendirmeden önce saat dilimi kayması hakkında bir şeyler yapacaksa, yerel saat dilimine bağlı olarak bir gün çok erken alabilirsiniz; bu durumda yukarıdaki seçeneklerden birini isteyeceksiniz.
Tom Dibble

7
java.sql.Dateveritabanı katmanı JDBC, JPA içindir. Web katmanı (veya herhangi bir istemci uygulaması) kesinlikle herhangi bir bağımlılık içermemelidir java.sql.*.
Küçük

2
@Tiny java.sql.Date, rt.jar içinde bulunur. Herhangi bir dış bağımlılık yoktur. Sadece dil özelliklerini kullanıyorsunuz.
George

2
java.sql.Datesadece java.util.Datezamana göre ayarlanmış 00:00:00ancak tasarım perspektifindeki nokta, java.sql.*istemcilerin Servlets / JSP gibi etkileşimde bulunduğu bir ön katman için tasarlanmamış olmasıdır. java.util.DateJava tarafında ve / java.sql.Timestampveya java.sql.*JDBC tarafında geçerli olan her şeyi .
Küçük

5
Bu, java.time'a göre "korkunç bir saldırı". * Yazar: stackoverflow.com/questions/33066904/… . Java 9'da java.sql.*sınıflar ayrı bir bağımlılık olacaktır.
Dherik

16

java.time, çoğu zaman sınıfından Instant nesneleri oluşturmak için kullanabileceğiniz Geçici arayüze sahiptir. Anında Arama, diğer tüm tarihler ve saatler için temel referans olan Epoch'taki zaman çizelgesinde milisaniyeyi temsil eder.

Dönüşümü yapmak için Tarihi Saat ve Bölge içeren bir ZonedDateTime değerine dönüştürmemiz gerekir:

LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);

12

Bir java.time.LocalDate öğesinden bir java.util.Date oluşturmak için ,

  • LocalDate'e zaman ekleme
  • saat dilimi içindeki tarih ve saati yorumlama
  • çünkü saniye / milisaniye sayısını almak çağında
  • java.util.Date oluştur

Kod aşağıdaki gibi görünebilir:

LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);

1
Bölge kimliğinde yazım hatası (ZoneIf)
assylias

localDate.atStartOfDay () bir ZonedDateTime oluşturur, ancak ZonedDateTime için toEpochSecond () yöntemi yoktur.
Kevin Sadler

@KevinSadler: Yöntem toEpochSecondmiras alınır java.time.chrono.ChronoZonedDateTime. Bkz. Docs.oracle.com/javase/8/docs/api/java/time/chrono/…
nosid

@nosid Düzeltmeniz için teşekkür ederiz. Eclipse kod tamamlama kullandığınızda bu (ve toInstance) bir seçenek olarak mevcut değil. Ama tam olarak yazarsam kabul edilmiş gibi görünüyor. Yanlışlıkla bu gerçeği nedeniyle bir yöntem değildi ve söylediğin gibi miras bir yöntem olarak listelenen ZonedDateTime için Javadoc görmedim sonucuna vardı. Üzgünüm, lütfen bir upclick kabul edin :)
Kevin Sadler

11

Bu benim için çalışıyor:

java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#toString--


6
Bu oldukça verimsiz
AndresQ

1
Anında
Arama'ya

1
Evet, o kadar verimli değil, ama çözümlerin çoğu çok ayrıntılı. Bu sadece ayrıntılı ve okunması ve anlaşılması daha kolay.
ceklock

2
@ehecatl Dikkat ... gelecekte NY -> Tokyo -> Mexico City saat içinde yapılabilir;)
Stephan

3

Kotlin Çözümü:

1) Bu uzantı işlevini bir yere yapıştırın.

fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())

2) Kullanın ve bunu bir daha google.

val myDate = myLocalDate.toDate()

11
"Kotlin'e geçiş" nasıl basittir? Bu bir Java sorusu.
ehecatl

1
Java LocalDate'i Tarihe Dönüştürmek, herhangi bir JVM geliştiricisi için yaygın ve can sıkıcı bir sorundur. Bu Kotlin geliştiricileri için bir çözümdür.
gyoder

-1
public static Date convertToTimeZone(Date date, String tzFrom, String tzTo) {
    return Date.from(LocalDateTime.ofInstant(date.toInstant(), ZoneId.of(tzTo)).atZone(ZoneId.of(tzFrom)).toInstant());
} 

2
Lütfen çözümünüzü açıklayın.
Martin Zabel

-2

Basit

public Date convertFrom(LocalDate date) {
    return java.sql.Timestamp.valueOf(date.atStartOfDay());
}

-3
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

4 yıl sonra cevabınız kabul edilenden nasıl farklı? İtibar artışı sağlamak için kopyala-yapıştır?
Stinger
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.