java.time
Modern yaklaşım, Java'nın en eski sürümleriyle birlikte gelen zahmetli eski tarih-saat sınıflarının yerini alan java.time sınıflarını kullanır .
java.sql.Timestamp
Sınıfı, eski sınıfların biridir. Artık gerek yok. Bunun yerine Instant
veya diğer java.time sınıflarını doğrudan veritabanınızla JDBC 4.2 ve sonraki sürümleri kullanarak kullanın.
Instant
Sınıfı zaman çizelgesinde bir anı temsil UTC çözünürlüğe sahip nanosaniye (ondalık kesir dokuz (9) haneye kadar).
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Mevcut bir ile birlikte Timestamp
çalışmanız gerekiyorsa, eski sınıflara eklenen yeni dönüştürme yöntemleri aracılığıyla hemen java.time biçimine dönüştürün.
Instant instant = myTimestamp.toInstant() ;
Başka bir saat dilimine ayarlamak için, saat dilimini ZoneId
nesne olarak belirtin . Bir belirtme uygun bir zaman dilimi adı biçiminde continent/region
gibi America/Montreal
, Africa/Casablanca
ya da Pacific/Auckland
. Hiçbir zaman gibi 3-4 letter sözde dilimleri kullanılıyorsa EST
veya IST
oldukları gibi değil , gerçek zaman dilimleri, değil standardize ve hatta benzersiz değil (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Instant
Bir ZonedDateTime
nesne üretmek için uygulayın .
ZonedDateTime zdt = instant.atZone( z ) ;
Kullanıcıya gösterilmek üzere bir dize oluşturmak için, DateTimeFormatter
birçok tartışma ve örnek bulmak üzere Stack Overflow öğesini arayın .
Sorunuz gerçekten kullanıcı veri girişinden tarih-saat nesnelerine kadar diğer yöne gitmekle ilgilidir. Veri girişinizi tarih ve günün saati olmak üzere iki bölüme ayırmak genellikle en iyisidir.
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
Sorunuz net değil. Kullanıcı tarafından girilen tarih ve saati UTC olarak yorumlamak ister misiniz? Veya başka bir saat diliminde mi?
UTC'yi kastettiyseniz, UTC OffsetDateTime
sabitini kullanarak bir uzaklık ile bir oluşturun ZoneOffset.UTC
.
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
Başka bir saat dilimini kastettiyseniz, bir saat dilimi nesnesiyle, a ZoneId
. Ama hangi saat dilimi? Varsayılan bir saat dilimi tespit edebilirsiniz. Veya kritikse, niyetinden emin olmak için kullanıcıyla onaylamanız gerekir.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Tanımı gereği her zaman UTC'de olan daha basit bir nesne elde etmek için bir Instant
.
Instant instant = odt.toInstant() ;
…veya…
Instant instant = zdt.toInstant() ;
Veritabanınıza gönderin.
myPreparedStatement.setObject( … , instant ) ;
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
.
Ş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 .
Java.time sınıflarını 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 .