Geçerli tarih ve saat nasıl alınır


342

Java'da geçerli tarih ve saati nasıl edinebilirim?

DateTime.NowC # den eşdeğer bir şey arıyorum .


Bu Soru, daha önce yinelenen olarak işaretlenen bu Sorudan daha eskidir . Bu yüzden atamayı tersine çevirdim, bu Soruyu yeniden açtım ve yeni soruyu kopya olarak işaretledim.
Basil Bourque

Yanıtlar:


414

DateHerhangi bir argüman olmadan yeni bir nesne oluşturun; bu, yeni nesneye geçerli tarih ve saati atar.

import java.util.Date;

Date d = new Date();

Sözleriyle Javadocs için sıfır argüman yapıcısı :

Bir Date nesnesini atar ve en yakın milisaniyeye kadar ölçülen , tahsis edildiği zamanı temsil edecek şekilde başlatır .

Kullandığınızdan java.util.Dateve olmadığınızdan emin olun java.sql.Date- ikincisinin sıfır arg yapıcısı yoktur ve tamamen farklı bir konuşmanın konusu olan biraz farklı semantiği vardır. :)


13
Ayrıca GregorianCalendar ve birçok benzer nesnenin aynı şekilde çalıştığını unutmayın. Hangi tür tarih / takvim nesnesi ile çalışıyorsanız çalışın, sıfır bağımsız değişken yapıcı genellikle nesneyi geçerli tarih / saate başlatır.
Peter Di Cecco

Tarih belgesinden: JDK 1.1'den itibaren, tarihler ve saat alanları arasında dönüştürme yapmak için Calendar sınıfı kullanılmalı ve tarih dizelerini biçimlendirmek ve ayrıştırmak için DateFormat sınıfı kullanılmalıdır.
Paolo M

9
Lütfen yeni Java8 API'lerini düşünün - LocalDateTime.now () ve ZonedDateTime.now ()
Oleg Mikheev

59

Java Tarih ve Takvim sınıfları pek çok kişi tarafından kötü tasarlanmış olarak değerlendirilir. Java'nın yerleşik tarih kütüphaneleri yerine yaygın olarak kullanılan bir kütüphane olan Joda Time'a bir göz atmalısınız .

DateTime.NowJoda Time'da eşdeğeri :

DateTime dt = new DateTime();

Güncelleme

Yorumlarda belirtildiği gibi, Joda Time'ın son sürümlerinin bir DateTime.now()yöntemi var, bu yüzden:

DateTime dt = DateTime.now();

4
Joda'nın şu anki (2.1) sürümünde statik bir DateTime.now yöntemi () var (isteğe bağlı olarak DateTimeZone veya Kronoloji'yi kabul ediyor). joda-time.sourceforge.net/apidocs/org/joda/time/…
Roman A. Taycher

1
Bu cevabın 2010 yılında yayınlandığına dikkat edin. Java 8, Joda Time'ın en iyi özelliklerinin çoğunu emdi. Daha fazla bilgi için resmi belgelere ve diğer birçok çevrimiçi makaleye bakın.
DavidS

36

tl; Dr.

Instant.now()

java.time

Java.util.Date sınıfının Java 8 ve sonraki sürümlerindeki yeni java.time paketi ( Tutorial ) tarafından modası geçmiş . Eski java.util.Date/.Calendar sınıfları kötü şöhretli, kafa karıştırıcı ve kusurludur. Onlardan kaçının.

ZonedDateTime

Java.time geçerli an alın.

ZonedDateTime now = ZonedDateTime.now();

Bir ZonedDateTimekapsül içerir:

  • Tarihi.
  • Saniyenin nanosaniye çözünürlüğünün bir kısmı ile günün zamanı .
  • Saat dilimi.

Herhangi bir saat dilimi belirtilmezse, JVM'nizin geçerli varsayılan saat dilimi sessizce atanır. İstediğiniz / beklenen saat dilimini belirtmek, varsayılan olarak örtük olarak kullanmaktan daha iyidir.

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );

UTC

Genellikle UTC zaman diliminde arka uç işinizi (iş mantığı, veritabanı, depolama, veri alışverişi) yapma alışkanlığına sahip olmak daha iyidir . Yukarıdaki kod dolaylı olarak JVM'nin geçerli varsayılan saat dilimine dayanır.

InstantSınıf nanosaniye çözünürlüğe sahip UTC zaman çizelgesinde bir anını temsil ediyor.

Instant instant = Instant.now();

InstantSınıf java.time bir temel yapı bloğu sınıftır ve kodunuzda sık kullanılabilir.

Biçimlendirme konusunda daha fazla esnekliğe ihtiyaç duyduğunuzda OffsetDateTime. Bir ZoneOffsetnesne belirtin . UTC için UTC için kullanışlı sabiti kullanın .

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

Saat dilimi

Kullanıcıya sunum için kolayca başka bir saat dilimine ayarlayabilirsiniz. Uygun bir saat dilimi adı kullanın , aslaEST veya gibi 3-4 harf kodunu kullanmayın IST.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime nowMontreal = instant.atZone( z );

Yerelleştirilen bu tarih-saat değerinin bir Dize temsilini oluşturun.

String output = DateTimeFormatter
    .ofLocalizedDate( FormatStyle.FULL )
    .withLocale( Locale.CANADA_FRENCH )
    .format ( nowMontreal );

Instant

Veya UTC'de kalmak için kullanın Instant. Bir Instantnesne, zaman çizgisinde, nanosaniye çözünürlüğüne kadar, her zaman UTC cinsinden bir anı temsil eder. Bu, yapı taşını bir zaman dilimi atamasıyla birlikte belirli bir tarih-saat için sağlar. Kavramsal olarak bu şekilde düşünebilirsiniz:

ZonedDateTime= Instant+ZoneId

Bir çıkarabilir Instantbir mesafede ZonedDateTime.

Instant instantNow = zdt.toInstant();

Bir Anında Arama ile başlayabilirsiniz. InstantHer zaman UTC'de olduğu gibi , burada bir saat dilimi belirtmenize gerek yoktur .

Instant now = Instant.now();

Ayrıca , yinelenen bir Soru hakkında daha fazla ayrıntı içeren başka bir yanıt gönderdim .
Basil Bourque




10

java.lang.System.currentTimeMillis(); dönemden beri datetime dönecek


Günlüğe kaydetme için iyi ancak kullanıcıya görüntüleme için ayrıştırma ve dönüştürme işlemi gerekiyor
Rishi Dua

6
import org.joda.time.DateTime;

DateTime now = DateTime.now();

5

Yeni bir Date nesnesi oluşturursanız, varsayılan olarak geçerli saate ayarlanır:

import java.util.Date;
Date now = new Date();

3

Java, tarih ve saat kullanım durumları için her zaman yetersiz desteğe sahiptir. Örneğin, varolan sınıflar ( java.util.Dateve gibi SimpleDateFormatter) eşzamanlılık sorunlarına yol açabilecek iş parçacığı için güvenli değildir. Ayrıca API'de bazı kusurlar var. Örneğin, yıllar java.util.Date1900'de başlar, aylar 1'de başlar ve günler 0'da başlar - çok sezgisel değil. Bu sorunlar, üçüncü taraf tarih ve saat kitaplıklarının popülerliğine yol açmıştır Joda-Time. Java SE 8 için yeni bir tarih ve saat API'sı tasarlanmıştır.

LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);

Doc başına :

Yöntem now(), sistem saatini ve varsayılan saat dilimini kullanarak geçerli tarih saatini döndürür, boş değil . Geçerli tarih saatini, varsayılan saat dilimindeki sistem saatinden alır. Bu, geçerli tarih saatini elde etmek için sistem saatini varsayılan saat diliminde sorgulayacaktır. Bu yöntemi kullanmak, saat sabit kodlanmış olduğu için test için alternatif bir saat kullanma yeteneğini önleyecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.