[英]How to get the current date and time
如何在 Java 中獲取當前日期和時間?
我正在尋找與 C# 中的DateTime.Now
等效的東西。
Instant.now()
java.util.Date 類已被 Java 8 及更高版本中的新java.time 包( Tutorial ) 過時。 舊的 java.util.Date/.Calendar 類是出了名的麻煩、混亂和有缺陷。 避開它們。
ZonedDateTime
在 java.time 中獲取當前時刻。
ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime
封裝了:
如果未指定時區,則以靜默方式分配 JVM 的當前默認時區。 最好指定您想要/預期的時區,而不是隱式依賴默認值。
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );
通常最好養成在UTC時區進行后端工作(業務邏輯、數據庫、存儲、數據交換)的習慣。 上面的代碼隱式依賴於 JVM 的當前默認時區。
Instant
類以 UTC 時間表示時間軸中的一個時刻,分辨率為納秒。
Instant instant = Instant.now();
Instant
類是 java.time 中的基本構建塊類,可能經常在您的代碼中使用。
當您需要更靈活的格式設置時,請轉換為OffsetDateTime
。 指定一個ZoneOffset
對象。 對於 UTC 使用方便的常量 UTC 。
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
您可以輕松調整到另一個時區以向用戶展示。 使用正確的時區名稱,不要使用 3-4 個字母的代碼,例如EST
或IST
。
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,請使用Instant
。 Instant
對象表示時間軸上的一個時刻,以納秒分辨率表示,始終采用 UTC。 這提供了分區日期時間的構建塊,以及時區分配。 你可以從概念上這樣想:
您可以從ZonedDateTime
提取Instant
。
Instant instantNow = zdt.toInstant();
您可以從 Instant 開始。 無需在此處指定時區,因為Instant
始終采用 UTC。
Instant now = Instant.now();
我更喜歡使用 Calendar 對象。
Calendar now = GregorianCalendar.getInstance()
我發現與它合作要容易得多。 您還可以從 Calendar 中獲取 Date 對象。
http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html
在 Java 8 中,它是:
ZonedDateTime dateTime = ZonedDateTime.now();
java.lang.System.currentTimeMillis();
將返回自紀元以來的日期時間
import org.joda.time.DateTime;
DateTime now = DateTime.now();
如果你創建一個新的 Date 對象,默認情況下它會被設置為當前時間:
import java.util.Date;
Date now = new Date();
Java 對日期和時間用例的支持一直不夠。 例如,現有的類(例如java.util.Date
和SimpleDateFormatter
)不是線程安全的,這可能會導致並發問題。 API 中也存在某些缺陷。 例如, java.util.Date
從 1900 開始,月從 1 開始,天從 0 開始——不是很直觀。 這些問題導致了第三方日期和時間庫的流行,例如Joda-Time
。 為了解決新的日期和時間 API 是為 Java SE 8 設計的。
LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);
根據文檔:
now()
方法使用系統時鍾和默認時區返回當前日期時間,而不是 null 。 它從默認時區的系統時鍾中獲取當前日期時間。 這將查詢默認時區中的系統時鍾以獲取當前日期時間。 使用此方法將阻止使用備用時鍾進行測試的能力,因為該時鍾是硬編碼的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.