tl; Dr.
LocalDate.of( 1985 , 1 , 1 )
…veya…
LocalDate.of( 1985 , Month.JANUARY , 1 )
ayrıntılar
java.util.Date
, java.util.Calendar
Ve java.text.SimpleDateFormat
Java ilk başlatılan ve gelişti zaman sınıflar çok hızlı koştu. Sınıflar iyi tasarlanmamış veya uygulanmamıştır. İyileştirmeler denendi, böylece bulduğunuz itirazlar. Maalesef iyileştirme girişimleri büyük ölçüde başarısız oldu. Sen gerektiğini bu sınıflar önlemek tamamen. Java 8'de yeni sınıflarla desteklenirler.
Kodunuzdaki Sorunlar
Bir java.util.Date'in hem tarih hem de saat bölümü vardır. Kodunuzdaki zaman bölümünü yok saydınız. Date sınıfı, JVM'nizin varsayılan saat dilimi tarafından tanımlanan günün başlangıcını alacak ve o zamanı Date nesnesine uygulayacaktır. Bu nedenle kodunuzun sonuçları, hangi makinede çalıştığına veya hangi saat diliminin ayarlandığına bağlı olarak değişir. Muhtemelen istediğin şey değil.
Sadece tarih istiyorsanız, doğum tarihi gibi saat bölümü olmadan bir Date
nesne kullanmak istemeyebilirsiniz . Tarihin yalnızca bir dizesini ISO 8601 biçiminde saklamak isteyebilirsiniz YYYY-MM-DD
. Veya LocalDate
Joda-Time'dan bir nesne kullanın (aşağıya bakın).
Joda-Time
Java ile öğrenilecek ilk şey: Java ile paketlenmiş kötü şöhretli java.util.Date & java.util.Calendar sınıflarından kaçının .
As doğru belirtildiği user3277382 tarafından cevap , kullanım ya Joda-Time ya da yeni java.time. * Paket Java 8'de.
Joda-Time 2.3 Örnek Kodu
DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" );
DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork );
DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC );
LocalDate birthDate = new LocalDate( 1985, 1, 1 );
Konsola dökümü…
System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway );
System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork );
System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt );
System.out.println( "birthDate: " + birthDate );
Çalıştırıldığında…
birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00
birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00
birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z
birthDate: 1985-01-01
java.time
Bu durumda java.time kodu Joda-Time koduyla hemen hemen aynıdır .
Bir saat dilimi ( ZoneId
) alırız ve bu saat dilimine atanmış bir tarih-saat nesnesi oluştururuz (ZonedDateTime
) . Daha sonra Değişmez Nesneler desenini kullanarak, eski nesnenin aynı anında ( çağdan beri nanosaniye sayısı ) dayalı ancak başka bir saat dilimi atanan yeni tarih saatleri oluştururuz . Son olarak biz almak LocalDate
hiçbir zaman günün-de saat diliminde olduğu tarih (yeni gün göründü önce de belirlerken saat dilimi geçerlidir haber olsa olan Oslo daha New York'a örneğin).
ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" );
ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway );
ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork );
ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar.
Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC.
LocalDate localDate_Norway = zdt_Norway.toLocalDate();
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 .