tl; dr
LocalDate.of( 2014 , 2 , 11 )
Korkunç eski java.util.Date
sınıfı kullanmakta ısrar ediyorsanız , modern java.time sınıflarından dönüştürün .
java.util.Date
.from(
LocalDate
.of( 2014 , 2 , 11 )
.atStartOfDay(
ZoneId.of( "Africa/Tunis" )
)
.toInstant()
)
Detaylar
"Kolay" istiyorsanız , Java ile birlikte gelen sorunlu java.util.Date & .Calendar sınıfları yerine Java 8'deki yeni java.time paketini kullanıyor olmalısınız .
java.time
Java 8 ve sonraki sürümlerde yerleşik olan java.time çerçevesi, zahmetli eski java.util.Date/.Calendar sınıflarının yerini alır.
Yalnızca tarih
Bir LocalDate
sınıf her zaman günün-veya saat dilimi bulunmayan bir tarih salt değeri temsil java.time tarafından sunulmaktadır. Örneğin, Paris'te yeni bir gün Montréal'den daha erken doğduğu için, bir tarihi belirlemek için bir saat dilimine ihtiyacınız vardır. ZoneId
Sınıf zaman dilimleri içindir.
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
LocalDate today = LocalDate.now( zoneId );
Konsola aktar:
System.out.println ( "today: " + today + " in zone: " + zoneId );
bugün: 2015-11-26 bölgesinde: Asya / Singapur
Veya yılı, ayı, günü belirtmek için bir fabrika yöntemi kullanın.
LocalDate localDate = LocalDate.of( 2014 , Month.FEBRUARY , 11 );
localDate: 2014-02-11
Veya bir DayOfWeek
numaralandırma nesnesi yerine 1-12 numaralı bir ay geçirin.
LocalDate localDate = LocalDate.of( 2014 , 2 , 11 );
Saat dilimi
LocalDate
Siz onu bir saat dilimine ayarlayana kadar A'nın gerçek bir anlamı yoktur. Java.time'da, bir ZonedDateTime
nesne oluşturmak için bir saat dilimi uygularız . Bu aynı zamanda günün saati anlamına da geliyor, ama ne zaman? Genellikle günün ilk anıyla gitmek mantıklıdır. Bunun zaman anlamına geldiğini düşünebilirsiniz 00:00:00.000
, ancak Yaz Saati Uygulaması (DST) ve belki diğer anormallikler nedeniyle her zaman doğru değildir. O zamanı varsaymak yerine, java.time'ı arayarak günün ilk anını belirlemesini istiyoruz atStartOfDay
.
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 zoneId = ZoneId.of( "Asia/Singapore" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
zdt: 2014-02-11T00: 00 + 08: 00 [Asya / Singapur]
UTC
Arka uç çalışması için (iş mantığı, veritabanı, veri depolama ve değişim) genellikle UTC saat dilimini kullanırız. Java.time'da Instant
sınıf, UTC'de zaman çizelgesindeki bir anı temsil eder. Bir Anlık nesne, bir ZonedDateTime'dan çağrılarak çıkarılabilir toInstant
.
Instant instant = zdt.toInstant();
anlık: 2014-02-10T16: 00: 00Z
Dönüştürmek
java.util.Date
Sınıfı tamamen kullanmaktan kaçınmalısınız . Ancak java.time için henüz güncellenmemiş eski kodla birlikte çalışmanız gerekiyorsa , ileri-geri dönüştürebilirsiniz. Eski sınıflara eklenen yeni dönüştürme yöntemlerine bakın.
java.util.Date d = java.util.from( instant ) ;
…ve…
Instant instant = d.toInstant() ;
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
.
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 .
Şu anda bakım modunda olan Joda-Time projesi, java.time sınıflarına geçişi tavsiye ediyor .
Java.time nesnelerini doğrudan veritabanınız ile takas edebilirsiniz . JDBC 4.2 veya üstü ile uyumlu bir JDBC sürücüsü kullanın . Dizelere gerek yok, derslere gerek yok . Hibernate 5 ve JPA 2.2 java.time'ı destekler .java.sql.*
Java.time sınıflarını nereden edinebilirim?
GÜNCELLEME: Joda-Time kitaplığı artık bakım modundadır ve java.time sınıflarına geçişi tavsiye eder . Tarih için bu bölümü yerinde bırakıyorum.
Joda-Zaman
Birincisi, Joda-Time mantıklı bir numaralandırma kullanıyor, bu yüzden Şubat 2
değil 1
. Başka bir şey, bir Joda-Time DateTime, saat dilimine sahip gibi görünen ancak olmayan java.util.Date'den farklı olarak atanmış saat dilimini gerçekten bilir.
Ve saat dilimini unutma. Aksi takdirde, JVM'nin varsayılanını alacaksınız.
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Singapore" );
DateTime dateTimeSingapore = new DateTime( 2014, 2, 11, 0, 0, timeZone );
DateTime dateTimeUtc = dateTimeSingapore.withZone( DateTimeZone.UTC );
java.util.Locale locale = new java.util.Locale( "ms", "SG" );
String output = DateTimeFormat.forStyle( "FF" ).withLocale( locale ).print( dateTimeSingapore );
Konsola aktar…
System.out.println( "dateTimeSingapore: " + dateTimeSingapore );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );
Çalıştırıldığında…
dateTimeSingapore: 2014-02-11T00:00:00.000+08:00
dateTimeUtc: 2014-02-10T16:00:00.000Z
output: Selasa, 2014 Februari 11 00:00:00 SGT
Dönüştürmek
Diğer sınıflarla kullanmak için java.util.Date biçimine dönüştürmeniz gerekirse…
java.util.Date date = dateTimeSingapore.toDate();