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.TimestampSınıfı, eski sınıfların biridir. Artık gerek yok. Bunun yerine Instantveya diğer java.time sınıflarını doğrudan veritabanınızla JDBC 4.2 ve sonraki sürümleri kullanarak kullanın.
InstantSı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 ZoneIdnesne olarak belirtin . Bir belirtme uygun bir zaman dilimi adı biçiminde continent/regiongibi America/Montreal, Africa/Casablancaya da Pacific/Auckland. Hiçbir zaman gibi 3-4 letter sözde dilimleri kullanılıyorsa ESTveya ISToldukları gibi değil , gerçek zaman dilimleri, değil standardize ve hatta benzersiz değil (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
InstantBir ZonedDateTimenesne üretmek için uygulayın .
ZonedDateTime zdt = instant.atZone( z ) ;
Kullanıcıya gösterilmek üzere bir dize oluşturmak için, DateTimeFormatterbirç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 OffsetDateTimesabitini 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 .