tl; Dr.
Nasıl java.util.Date java.sql.Date dönüştürmek için?
Yapma. Her iki sınıf da modası geçmiş.
- Kullanım java.time yerine mirası sınıfları
java.util.Date
ve java.sql.Date
daha sonra JDBC 4.2 veya birlikte.
- Henüz java.time sürümüne güncellenmemiş kodla birlikte çalışılıyorsa java.time biçimine / dilinden dönüştürün.
İle örnek sorgu PreparedStatement
.
myPreparedStatement.setObject(
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)
Yedekler:
Instant
yerine java.util.Date
İkisi UTC bir an temsil eder. ama şimdi milisaniye yerine nanosaniye ile.
LocalDate
java.sql.Date
İkisi yerine, günün saati ve saat dilimi olmayan salt tarih değerini temsil eder.
ayrıntılar
Yalnızca tarih değerleriyle (günün saati, saat dilimi yok) çalışmaya çalışıyorsanız, LocalDate
sınıfı kullanın java.util.Date
.
java.time
Java 8 ve sonraki sürümlerinde, Java'nın ilk sürümleriyle birlikte gelen sorunlu eski tarih-saat sınıfları yeni java.time paketi tarafından desteklenmiştir . Bkz. Oracle Eğitimi . Çok işlevsellik içinde Java 6 ve 7 geri-taşındıktan ThreeTen-backport ve ayrıca içinde Android'e uyarlanmıştır ThreeTenABP .
Bir SQL veri türü DATE
hiçbir zaman gün-ve saat dilimi olmayan, tarih salt olması gerekiyordu. Java java.time.LocalDate
, Java 8'e kadar hiçbir zaman böyle bir sınıfa sahip olmadı †. Bugün belirli bir saat dilimine göre bugünün tarihini alarak böyle bir değer yaratalım (zaman dilimi, Paris'te Montréal'e göre daha erken yeni bir gün geçtiği için bir tarih belirlemede önemlidir. misal).
LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) ); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".
Bu noktada, yapılabilir. Senin Eğer JDBC sürücüsü ile uyumlu olduğu JDBC 4.2 spec , bir geçmek mümkün olmalıdır LocalDate
aracılığıyla setObject
bir üzerinde PreparedStatement
SQL TARİH alanına mağazaya.
myPreparedStatement.setObject( 1 , localDate );
Benzer şekilde, ResultSet::getObject
bir SQL TARİH sütunundan bir Java LocalDate
nesnesine getirmek için kullanın . Sınıfı ikinci bağımsız değişkende belirtmek, kodunuzu güvenli hale getirir .
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
Başka bir deyişle, bu sorunun tamamı JDBC 4.2 veya sonraki sürümleri altında ilgisizdir .
JDBC sürücünüz bu şekilde çalışmazsa, java.sql türlerine dönüştürmeye geri dönmeniz gerekir.
Java.sql.Date dosyasına dönüştürün
Dönüştürmek için eski tarih-saat sınıflarına eklenen yeni yöntemleri kullanın. Bir java.sql.Date.valueOf(…)
dönüştürmek için arayabilirsiniz LocalDate
.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
Ve diğer yöne gidiyor.
LocalDate localDate = sqlDate.toLocalDate();
Şuradan dönüştürülüyor: java.util.Date
Eski tarih-saat sınıflarını kullanmaktan kaçınmanız gerekirken, mevcut kodla çalışırken zorlanabilirsiniz. Öyleyse, java.time biçimine / dilinden dönüştürebilirsiniz.
Üzerinden gidin Instant
UTC zaman çizelgesi üzerinde bir anı temsil sınıf,. An Instant
, a java.util.Date
. Ama dikkat Instant
etmek çözünürlüğe kadar sahiptir nanosaniye ise java.util.Date
sadece sahiptir milisaniye çözünürlük.
Dönüştürmek için eski sınıflara eklenen yeni yöntemleri kullanın. Örneğin, java.util.Date.from( Instant )
ve java.util.Date::toInstant
.
Instant instant = myUtilDate.toInstant();
Bir tarih belirlemek için bir saat dilimi bağlamına ihtiyacımız var. Belirli bir an için, tarih tüm dünyada saat dilimine göre değişir. Bir uygula ZoneId
bir olsun ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† java.sql.Date sınıf yerindeymiş gibi tarih-sadece bir zaman günün-olmadan ama aslında hiç yok bir zaman günün-, bir gece yarısı zaman ayarlanır. Kafa karıştırıcı? Evet, eski tarih-saat sınıfları dağınık.
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
.
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 .
Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya sonraki bir sürümüyle uyumlu bir JDBC sürücüsü kullanın . Dizeye gerek yok, sınıflara gerek yok .java.sql.*
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 .