tl; Dr.
Instant.now() // Capture the current moment in UTC.
Bu değeri temsil etmek için bir Dize oluşturun:
Instant.now().toString()
2016-09-13T23: 30: 52.123Z
ayrıntılar
As Jon Skeet tarafından doğru cevap belirtildiği, bir java.util.Date nesne vardır hiçbir zaman dilimini † . Ancak toString
uygulaması, o tarih-saat değerinin String temsilini oluştururken JVM'nin varsayılan saat dilimini uygular. Naif programcıya kafa karıştırıcı bir şekilde, bir Tarihin saat dilimi var gibi görünüyor , ancak yok.
java.util.Date
, j.u.Calendar
Ve java.text.SimpleDateFormat
Java ile birlikte sınıfları herkesin bildiği zahmetli bulunmaktadır. Onlardan kaçının. Bunun yerine, şu yetkili tarih-saat kitaplıklarından birini kullanın:
java.time (Java 8)
Java 8 , eski java.util.Date/Calendar sınıflarını tamamlamak için mükemmel bir yeni java.time. * Paketi getiriyor .
UTC / GMT'de şimdiki zamanı almak basit bir astar…
Instant instant = Instant.now();
Yani Instant
sınıf içinde zaman çizelgesi üzerinde bir an temsil eden java.time temel yapı taşı olan UTC çözünürlüğe sahip nanosaniye .
Java 8'de geçerli an yalnızca milisaniyeye kadar çözünürlükte yakalanır. Java 9 yeni bir uygulamasıdır getiriyor ait Clock
host bilgisayarın saati donanım yeteneği bağlı olarak, bu sınıfın tam nanosaniye yeteneği up yakalamaları güncel anı.
'S toString
bir yöntem kullanarak değer bir String temsilini oluşturur belirli bir ISO 8601 biçimi . Bu biçim , saniye bölümünü temsil etmek için gerektiği şekilde sıfır, üç, altı veya dokuz basamaklı basamaklar ( milisaniye , mikrosaniye veya nanosaniye ) verir.
Daha esnek biçimlendirme veya diğer ek özellikler istiyorsanız, UTC'nin kendisinin ( ZoneOffset.UTC
sabit ) bir a olması için UTC'den sıfırdan bir ofset uygulayın OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Konsola dökümü…
System.out.println( "now.toString(): " + now );
Çalıştırıldığında…
now.toString(): 2014-01-21T23:42:03.522Z
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 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 .
Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .
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
GÜNCELLEME: Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .
Kullanılması Joda-Time serbest-of-maliyet 3. taraf açık kaynak kütüphane, kod sadece bir satırda geçerli tarih-zaman dönebilirsiniz.
Joda-Time, Java 8'deki yeni java.time. * Sınıflarına ilham verdi, ancak farklı bir mimariye sahip. Joda-Time'ı Java'nın eski sürümlerinde kullanabilirsiniz. Joda-Time, Java 8'de çalışmaya devam ediyor ve aktif olarak korunmaya devam ediyor (2014 itibariyle). Ancak, Joda-Time ekibi java.time'a geçişi tavsiye eder.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Daha ayrıntılı örnek kod (Joda-Time 2.3)…
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
Konsola dökümü…
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
Çalıştırıldığında…
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
Saat dilimi çalışması yapan daha fazla örnek kod için benzer bir soruya verdiğim cevaba bakın .
Saat dilimi
JVM'nin geçerli varsayılan saat dilimine dolaylı olarak güvenmek yerine her zaman bir saat dilimi belirtmenizi öneririm (her an değişebilir!). Böyle bir güven, tarih-saat çalışmasında ortak bir karışıklık ve hata nedeni gibi görünmektedir.
Arama yaparken now()
atanacak istenen / beklenen zaman dilimini geçirin. DateTimeZone
Sınıfı kullanın .
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
Bu sınıf UTC saat dilimi için sabittir .
DateTime now = DateTime.now( DateTimeZone.UTC );
JVM'nin geçerli varsayılan saat dilimini gerçekten kullanmak istiyorsanız, kodunuzun kendi kendini belgelemesi için açık bir arama yapın.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
ISO 8601 formatları hakkında bilgi edinin . Hem java.time hem de Joda-Time, dizenin ayrıştırılması ve oluşturulması için bu standardın makul biçimlerini varsayılan olarak kullanır.
† Aslında, java.util.Date , kaynak kodu katmanlarının altında gömülü bir zaman dilimine sahiptir. En pratik amaçlar için, bu zaman dilimi göz ardı edilir. Yani, steno olarak java.util.Date'in saat dilimi yok diyoruz. Ayrıca, gömülü saat dilimi, Date'in yönteminde kullanılan bölge değildirtoString
; bu yöntem JVM'nin geçerli varsayılan saat dilimini kullanır. Bu kafa karıştırıcı sınıftan kaçınmak ve Joda-Time ve java.time ile devam etmek için daha fazla neden.