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.Dateve 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 LocalDateTimesaat 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 LocalDateTimeo 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/regiongibi America/Montreal, Africa/Casablancaya da Pacific/Auckland, ya da Asia/Karachi. 3-4 harfli bir kısaltma kullanmayın gibi ESTya ISTya PKToldukları 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 ZoneIdalmak 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:34Pakistan'da öğlen mi, Fransa'da öğlen mi yoksa Québec'te öğlen mi? Pakistan'da öğle +05:00saatini 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. InstantSı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 .