tl; dr
LocalDateTime.parse(
"2016-01-23 12:34".replace( " " , "T" )
)
.atZone( ZoneId.of( "Asia/Karachi" ) )
.plusMinutes( 10 )
java.time
Tarih-saat çalışması için mükemmel java.time sınıflarını kullanın. Bu sınıflar, java.util.Date
ve gibi zahmetli eski tarih-saat sınıflarının yerini alır java.util.Calendar
.
ISO 8601
Java.time sınıfları , tarih-saat değerlerinin dizelerini ayrıştırmak / oluşturmak için varsayılan olarak standart ISO 8601 biçimlerini kullanır . Giriş dizenizin uyumlu olmasını sağlamak için ortadaki SPACE'i bir T
.
String input = "2016-01-23 12:34" ;
String inputModified = input.replace( " " , "T" );
LocalDateTime
Giriş dizenizi LocalDateTime
saat dilimi veya UTC'den sapma hakkında herhangi bir bilgi olmadığı için ayrıştırın .
LocalDateTime ldt = LocalDateTime.parse( inputModified );
On dakika ekleyin.
LocalDateTime ldtLater = ldt.plusMinutes( 10 );
ldt.toString (): 2016-01-23T12: 34
ldtLater.toString (): 2016-01-23T12: 44
IdeOne.com'da canlı koda bakın .
Yani LocalDateTime
o bu yüzden, hiçbir zaman dilimini sahip olmayan zaman çizelgesi üzerinde bir noktayı temsil eder. Gerçek bir ana çevirmek için bir saat dilimi uygulayın. Bir belirtme uygun bir zaman dilimi adı biçiminde continent/region
gibi America/Montreal
, Africa/Casablanca
ya da Pacific/Auckland
, ya da Asia/Karachi
. 3-4 harfli bir kısaltma kullanmayın gibi EST
ya IST
ya PKT
oldukları gibi değil , gerçek zaman dilimleri, değil standardize ve hatta benzersiz değil (!).
ZonedDateTime
Bu değer için amaçlanan saat dilimini biliyorsanız, a ZoneId
almak için a uygulayın ZonedDateTime
.
ZoneId z = ZoneId.of( "Asia/Karachi" );
ZonedDateTime zdt = ldt.atZone( z );
zdt.toString (): 2016-01-23T12: 44 + 05: 00 [Asya / Karaçi]
Anormallikler
Bir saat dilimi eklemeden önce mi sonra mı ekleyeceğinizi düşünün. Duvar saati zamanını değiştiren Yaz Saati Uygulaması (DST) gibi anormallikler nedeniyle çok farklı bir sonuç alabilirsiniz .
Bölge eklemeden önce veya sonra 10 dakika eklemeniz gerekip gerekmediği, iş senaryonuzun ve kurallarınızın anlamına bağlıdır.
İpucu: Zaman çizelgesinde belirli bir ana niyet ettiğinizde, her zaman saat dilimi bilgilerini saklayın . Giriş verilerinizde olduğu gibi bu bilgileri kaybetmeyin. Değer 12:34
Pakistan'da öğlen mi, Fransa'da öğlen mi yoksa Québec'te öğlen mi? Pakistan'da öğle +05:00
saatini kastettiyseniz, bunu en azından UTC'den uzaklığı ( ) ve daha da iyisi saat diliminin adını ( ) ekleyerek söyleyin Asia/Karachi
.
Instant
UTC'nin merceğinden görülenle aynı anı istiyorsanız, bir 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 = zdt.toInstant();
Dönüştürmek
Mümkün olduğunca eski tarih-saat sınıflarından kaçının. Ama mecbur kalırsan, dönüştürebilirsin. Eski sınıflara eklenen yeni yöntemleri çağırın.
java.util.Date utilDate = java.util.Date.from( 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'a 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?
- Java SE 8 ve SE 9 ve üstü
- Yerleşik.
- Paket uygulama ile standart Java API'sinin bir parçası.
- Java 9, bazı küçük özellikler ve düzeltmeler ekler.
- Java SE 6 ve SE 7
- Android
ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için kanıtlayıcı bir zemindir. Burada bazı yararlı sınıfları gibi bulabilir Interval
, YearWeek
, YearQuarter
, ve daha .