2010-01-06 38 views
326

如何在Java中獲取當前日期?相當於C#的DateTime.Now在Java中嗎?

在C#中它是DateTime.Now

+0

此問題早於[此問題](http://stackoverflow.com/q/5175728/642706)以前被標記爲重複。所以我改變了名稱,重新開放了這個問題,並將新問題標記爲重複。 – 2016-09-07 21:46:35

+1

「複製」中的標題更清晰,並且可以通過Google搜索更容易找到 – ragerdl 2017-03-19 18:27:42

回答

402

僅僅構造一個沒有任何參數的新對象Date;這會將當前日期和時間分配給新對象。

import java.util.Date; 

Date d = new Date(); 

the Javadocs詞語爲the zero-argument constructor

分配Date對象和,它表示測量至最近的毫秒在它被分配的時候,對其進行初始化。

確保您使用java.util.Date而不是java.sql.Date - 後者不具有零參數的構造函數,並具有略微不同的語義是一個完全不同的談話主題。 :)

+13

另請注意,GregorianCalendar和許多類似的對象的工作方式相同。因此,無論您使用哪種類型的日期/日曆對象,零參數構造函數通常會將對象初始化爲當前日期/時間。 – 2010-01-06 01:02:19

+0

從日期文檔:從JDK 1.1開始,應該使用Calendar類在日期和時間字段之間進行轉換,並且應該使用DateFormat類來格式化和分析日期字符串。 – 2013-08-07 14:06:57

+8

請考慮新的Java8 API - [LocalDateTime.now()和ZonedDateTime.now()](http://stackoverflow.com/a/26225884/513342) – 2014-12-09 06:36:24

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

注意,Date對象是可變的,如果你想做的任何事情複雜,使用jodatime

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

添加「新」來修復錯誤。 – 2012-10-23 18:36:57

16

我更喜歡使用日曆對象:

+4

或者它可以簡單地'Calendar.getInstance()' – draw 2013-05-04 03:36:51

58

Java的DateCalendar類被認爲是被許多設計不佳。您應該看看Joda Time,這是一個通常用來代替Java內置日期庫的庫。

DateTime.Now在約達時間相對應的是:

DateTime dt = new DateTime(); 

更新

正如在評論中指出,約達時間的最新版本有DateTime.now()方法,所以:

DateTime dt = DateTime.now(); 
+4

Joda的當前(2.1)版本似乎有一個靜態的DateTime.now方法()(可選接受DateTimeZone或Chronology)。 http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html#now%28%29 – 2012-09-24 12:52:03

+1

請注意,此答案已於2010年發佈.Java 8吸收了Joda Time的許多最佳功能。有關更多信息,請參見[官方文檔](https://docs.oracle.com/javase/tutorial/datetime/index.html)和許多其他在線文章。 – DavidS 2016-02-02 20:46:13

10

java.lang.System.currentTimeMillis();將返回自時代以來的日期時間

+0

適用於日誌記錄,但需要解析和轉換才能顯示給用戶 – 2014-07-24 08:40:39

6
import org.joda.time.DateTime; 

DateTime now = DateTime.now(); 
13

在Java 8是:

ZonedDateTime dateTime = ZonedDateTime.now(); 
27

TL;博士

Instant.now() 

的Java。time

在Java 8及更高版本中,java.util.Date類已被新的java.time packageTutorial)過時。古老的java.util.Date/.Calendar類非常麻煩,令人困惑,並且存在缺陷。避免它們。

ZonedDateTime

獲取java.time當前時刻。

ZonedDateTime now = ZonedDateTime.now(); 

一個ZonedDateTime封裝:

  • 日期。
  • 時間,幾分之一秒到nanosecond分辨率。
  • 時區。

如果沒有指定時區,則您的JVM的當前默認時區將被靜默分配。更好地指定您想要的/預期的時區,而不是隱式地依賴默認值。

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

UTC

一般都比較好做後端的工作(業務邏輯,數據庫,存儲,數據交換)所有UTC時區的習慣來獲得。上面的代碼隱含地依賴於JVM當前的默認時區。

Instant類表示UTC時間軸中的一個時刻,分辨率爲納秒。

Instant instant = Instant.now(); 

Instant類是java.time一個基本構建塊級和可在代碼中經常使用。

當您需要更多的格式化靈活性時,轉換爲OffsetDateTime。指定一個ZoneOffset對象。對於UTC使用便利的constant for UTC

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

時區

您可以輕鬆地調整到另一個時區呈現給用戶。使用proper time zone name,從不 3-4字母代碼,如ESTIST

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

生成該日期時間值的字符串表示,本地化。

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

Instant

或者留在UTC,使用InstantInstant對象表示時間軸上的一個時刻,以毫微秒分辨率表示,始終以UTC表示。這提供了分區日期時間的構建塊以及時區分配。你可以認爲它在概念上是這樣的:

ZonedDateTime = Instant + ZoneId

您可以提取從ZonedDateTime一個Instant

Instant instantNow = zdt.toInstant(); 

您可以從Instant開始。無需在此指定時區,因爲Instant始終採用UTC。

Instant now = Instant.now(); 
+0

我還發布了[另一個答案](http://stackoverflow.com/a/39379431/642706),其中提供了有關重複問題的更多詳細信息。 – 2016-09-07 21:45:16

2

Java對日期和時間用例的支持始終不足。例如,現有類(如java.util.DateSimpleDateFormatter)不是線程安全的,可能會導致併發問題。 API也存在一些缺陷。例如,java.util.Date中的年份從1900開始,月份從1開始,並且天從0開始 - 不太直觀。這些問題導致第三方日期和時間庫的流行,如Joda-Time。爲了應對新的日期和時間API旨在對Java SE 8

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

doc

使用系統 時鐘和默認時間now()返回當前的日期,時間的方法-zone,非空。它從默認時區的系統時鐘獲取當前日期時間 。這將在默認時區 查詢系統時鐘以獲取當前的日期時間 。由於時鐘是硬編碼的,因此使用此方法將會妨礙使用另一個時鐘進行測試的功能。