tl; Dr.
myUtilDate.toInstant() // Convert `java.util.Date` to `Instant`.
.atOffset( ZoneOffset.UTC ) // Transform `Instant` to `OffsetDateTime`.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // Generate a String.
.replace( "T" , " " ) // Put a SPACE in the middle.
2014-11-14 14:05:09
java.time
Modern yol, şimdi sorunlu eski eski tarih-saat sınıflarını tamamlayan java.time sınıflarıdır.
İlk java.util.Date
önce bir Instant
. Instant
Sınıf içinde zaman çizelgesi üzerinde bir anını temsil UTC çözünürlüğe sahip nanosaniye (ondalık kesir dokuz (9) haneye kadar).
Java.time'a / java.time aralarından dönüşümler, eski sınıflara eklenen yeni yöntemlerle gerçekleştirilir.
Instant instant = myUtilDate.toInstant();
Hem sizin java.util.Date
hem java.time.Instant
de UTC'de . Tarih ve saati UTC olarak görmek istiyorsanız, öyle olsun. toString
Standart ISO 8601 biçiminde bir String oluşturmak için arayın .
String output = instant.toString();
2014-11-14T14: 05: 09Z
Diğer formatlar için, Instant
daha esnek hale getirmeniz gerekir OffsetDateTime
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
odt.toString (): 2020-05-01T21: 25: 35.957Z
Bu kodun IdeOne.com'da canlı yayınlandığını görün .
Bir Dizeyi istediğiniz biçimde almak için, a belirtin DateTimeFormatter
. Özel bir biçim belirtebilirsiniz. Ancak, önceden tanımlanmış biçimlendiricilerden ( ISO_LOCAL_DATE_TIME
) birini kullanır T
ve çıktısında bir SPACE ile yer değiştiririm .
String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
2014-11-14 14:05:09
Bu arada, UTC'den veya saat dilimi bilgisini bilerek kaybettiğiniz bu tür bir biçimi önermiyorum . Dizenin tarih-saat değerinin anlamı konusunda belirsizlik yaratır.
Ayrıca veri kaybına dikkat edin, çünkü String'inizin tarih-zaman değerini temsil etmesinde herhangi bir kesirli saniye yok sayılır (etkin bir şekilde kesilir).
Bazı belirli bölgenin merceğinden aynı anda görmek için duvar saatlik süre , bir geçerli ZoneId
bir olsun ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [Amerika / Montreal]
Biçimlendirilmiş dize oluşturmak için, yukarıdaki gibi aynı şeyi ancak onların yerini odt
ile zdt
.
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
2014-11-14 14:05:09
Bu kodu çok sayıda yürütürseniz, biraz daha verimli olmak ve çağrı yapmaktan kaçınmak isteyebilirsiniz String::replace
. Bu aramayı bırakmak da kodunuzu kısaltır. İstenirse, kendi DateTimeFormatter
nesnenizde kendi biçimlendirme deseninizi belirtin . Bu örneği yeniden kullanım için sabit veya üye olarak önbelleğe alın.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ); // Data-loss: Dropping any fractional second.
Örneği geçirerek bu biçimlendiriciyi uygulayın.
String output = zdt.format( f );
Java.time hakkında
Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar gibi zahmetli eski tarih-saat sınıfları yerini java.util.Date
, .Calendar
& java.text.SimpleDateFormat
.
Artık bakım modunda olan Joda-Time projesi java.time'a 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.
Çok java.time işlevselliği Java 6 ve 7 geri-taşındıktan ThreeTen-backport ve daha fazla adapte Android içinde ThreeTenABP (bkz ... nasıl kullanılır ).
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.