tl; Dr.
mevcut "en iyi uygulamayı" tavsiye eder Date
veCalendar
en iyisi her zaman lehine olan Calendar
aşırıDate
Bu eski sınıflardan tamamen kaçının . Kullanım java.time yerine sınıfları.
ayrıntılar
Ortomala tarafından cevap Lokni çağdaş kullanarak önermek doğru java.time oldukça zahmetli eski eski tarih-saat sınıfları (daha sınıflar Date
, Calendar
vb.) Ancak bu Cevap yanlış sınıfı eşdeğer olarak önermektedir (bu Cevap hakkındaki yorumuma bakın).
Java.time kullanma
Java.time sınıfları , eski tarih-saat sınıfları, gece ve gündüz farkı üzerinde büyük bir gelişmedir. Eski sınıflar kötü tasarlanmış, kafa karıştırıcı ve zahmetlidir. Mümkün olduğunca eski sınıflardan kaçınmalısınız. Ancak eski / yeniye / yenisinden dönüştürmeniz gerektiğinde, eski sınıflara eklenen yeni yöntemleri çağırarak bunu yapabilirsiniz .
Dönüştürme hakkında daha fazla bilgi için, başka bir Soruya cevap ve nifty şemasına bakın , java.util'i dönüştürün. .
Yığın Taşması aranması, java.time kullanımıyla ilgili yüzlerce örnek Soru ve Cevap verir. Ama işte kısa bir özet.
Instant
Mevcut anı bir ile alın Instant
. 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 = Instant.now();
ZonedDateTime
Aynı anda , belirli bir bölgenin duvar saati süresinin merceğinden aynı anda görmek için , bir saat dilimi ( ZoneId
) uygulayın ZonedDateTime
.
Saat dilimi
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 harfli bir kısaltma kullanın 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" );
ZonedDateTime zdt = instant.atZone();
dengelemek
Saat dilimi, bir bölgenin UTC'den uzaklığındaki değişiklik geçmişidir . Ama bazen sadece tam bölge olmayan bir ofset verilir. Bu durumda OffsetDateTime
sınıfı kullanın .
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
Bir zaman diliminin kullanılması, sadece bir ofsetin kullanılması tercih edilir.
LocalDateTime
Local…
Sınıflardaki “Yerel” , belirli bir yer değil, herhangi bir yer anlamına gelir . Yani adı karşı sezgisel olabilir.
LocalDateTime
, LocalDate
ve LocalTime
ofset veya saat dilimi hakkında herhangi bir bilgi içermemesi. Onlar do Yani değil gerçek anları temsil, bunlar değil puan cetvelinde. Şüphe veya karmaşa, kullandığınızda ZonedDateTime
yerine LocalDateTime
. Daha fazla tartışma için Yığın Taşması'nda arama yapın.
Teller
Tarih ve saat nesnelerini, değerlerini temsil eden dizelerle sınırlamayın. Bir tarih-saat nesnesi almak için bir dizeyi ayrıştırabilir ve bir tarih-saat nesnesinden bir dize oluşturabilirsiniz. Ama dize asla tarih-zamanın kendisi değildir.
Java.time sınıflarında varsayılan olarak kullanılan standart ISO 8601 biçimleri hakkında bilgi edinin .
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 .
JDBC 4.2 veya sonraki bir sürümüyle uyumlu bir JDBC sürücüsü kullanarak , java.time nesnelerini doğrudan veritabanınızla değiştirebilirsiniz. Dizelere veya java.sql. * Sınıflarına gerek yoktur.
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 .