tl; Dr.
… Parsed… bir String'den… saat dilimi belirtilmedi… Belirli bir saat dilimi ayarlamak istiyorum
LocalDateTime.parse( "2018-01-23T01:23:45.123456789" ) // Parse string, lacking an offset-from-UTC and lacking a time zone, as a `LocalDateTime`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Assign the time zone for which you are certain this date-time was intended. Instantiates a `ZonedDateTime` object.
JuDate'de Saat Dilimi Yok
Diğer doğru cevapların belirttiği gibi, java.util.Date'in saat dilimi yoktur † . UTC / GMT'yi temsil eder (saat dilimi farkı yok). toString
Yöntemi bir String temsili oluştururken JVM'nin varsayılan saat dilimini uyguladığı için çok kafa karıştırıcı .
JuDate'den kaçının
Bu ve diğer birçok nedenden dolayı, yerleşik java.util.Date & .Calendar & java.text.SimpleDateFormat'ı kullanmaktan kaçınmalısınız. Onlar çok zahmetlidir.
Bunun yerine Java 8 ile birlikte gelen java.time paketini kullanın .
java.time
Java.time sınıfları zaman çizelgesindeki bir anı üç şekilde temsil edebilir:
- UTC (
Instant
)
- Bir ofset ile (
OffsetDateTime
ile ZoneOffset
)
- Bir saat dilimi ile (
ZonedDateTime
ile ZoneId
)
Instant
In java.time , temel yapı taşıdır Instant
UTC olarak zaman tablosunda bir an. Instant
İş mantığınızın çoğunda nesneler kullanın .
Instant instant = Instant.now();
OffsetDateTime
Bir yerin duvar saati zamanına ayarlamak için UTC'den ofset uygulayın .
Bir uygula ZoneOffset
bir olsun OffsetDateTime
.
ZoneOffset zoneOffset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset );
ZonedDateTime
Daha iyi bir zaman dilimi , bir ofset artı Yaz Saati Uygulaması (DST) gibi anormalliklerin ele alınması için kurallar uygulamaktır .
Bir uygula ZoneId
bir etmek Instant
de zaten ona ZonedDateTime
. Her zaman uygun bir saat dilimi adı belirtin . Hiçbir zaman gibi 3-4 kısaltmalar kullanmak EST
veya IST
ne eşsiz ne de standardize olması.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
LocalDateTime
Giriş dizgisinde ofset veya bölgenin herhangi bir göstergesi yoksa, olarak ayrıştırın LocalDateTime
.
İstediğiniz saat diliminden eminseniz, a ZoneId
üretmek için a atayın ZonedDateTime
. Yukarıdaki tl; dr bölümünde yukarıdaki kod örneğine bakınız .
Biçimlendirilmiş Dizeler
toString
Standart ISO 8601 biçiminde tarih-saat değerini temsil eden bir String oluşturmak için bu üç sınıftan herhangi birinde yöntemi çağırın . ZonedDateTime
Sınıf parantez içinde zaman dilimi adı ekleyerek standart bir biçim uzanır.
String outputInstant = instant.toString(); // Ex: 2011-12-03T10:15:30Z
String outputOdt = odt.toString(); // Ex: 2007-12-03T10:15:30+01:00
String outputZdt = zdt.toString(); // Ex: 2007-12-03T10:15:30+01:00[Europe/Paris]
Diğer formatlar için DateTimeFormatter
sınıfı kullanın . Genellikle, sınıfın kullanıcının beklenen insan dilini ve kültürel normlarını kullanarak yerelleştirilmiş formatlar oluşturmasına izin vermek en iyisidir. Veya belirli bir biçim belirleyebilirsiniz.
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 .
Joda-Time
İken Joda-Time hala aktif korunur, onun yapımcıları kısa sürede uygun olduğu gibi java.time göç etmek söylediler. Bu bölümü referans olarak olduğu gibi bırakıyorum, java.time
bunun yerine yukarıdaki bölümü kullanmanızı öneririm .
In Joda-Time , bir tarih-saat nesnesi ( DateTime
) gerçekten kendisine atanmış zaman dilimini biliyor. Bu UTC'den sapma ve o zaman diliminin Yaz Saati Uygulaması (DST) ve diğer anormalliklerin kuralları ve geçmişi anlamına gelir .
String input = "2014-01-02T03:04:05";
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeIndia = new DateTime( input, timeZone );
DateTime dateTimeUtcGmt = dateTimeIndia.withZone( DateTimeZone.UTC );
ISO 8601 biçiminde toString
bir String oluşturmak için yöntemi çağırın .
String output = dateTimeIndia.toString();
Joda-Time ayrıca her türlü diğer String formatlarını oluşturmak için zengin özellikler sunar.
Gerekirse, Joda-Time DateTime'dan java.util.Date'e dönüştürebilirsiniz.
Java.util.Date date = dateTimeIndia.toDate();
Bazı oldukça ayrıntılı daha fazla örnek bulmak için "joda tarih" için StackOverflow arayın.
† Aslında orada olan bazı iç fonksiyonları için kullanılan bir java.util.Date gömülü bir zaman dilimi, (bu Yanıt yorumlara bakınız). Ancak bu dahili saat dilimi bir özellik olarak gösterilmez ve ayarlanamaz. Bu dahili saat dilimi, tarih-saat değerinin dize ile temsil edilmesinde yöntem tarafından kullanılan bölge değildirtoString
; bunun yerine JVM'nin geçerli varsayılan saat dilimi anında uygulanır. Kısaca, sık sık “juDate'in saat dilimi yok” diyoruz. Kafa karıştırıcı? Evet. Bu yorgun eski sınıflardan kaçınmanın bir başka nedeni.