簡體   English   中英

如何獲取當前日期和時間

[英]How to get the current date and time

如何在 Java 中獲取當前日期和時間?

我正在尋找與 C# 中的DateTime.Now等效的東西。

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

import java.util.Date;

Date d = new Date();

用零參數構造函數的 Javadoc的話來說:

分配一個 Date 對象並初始化它,以便它表示它被分配的時間,測量到最接近的毫秒。

確保您使用的是java.util.Date而不是java.sql.Date - 后者沒有零參數構造函數,並且具有一些不同的語義,這些語義是完全不同的對話的主題。 :)

許多人認為 Java DateCalendar類的設計很差。 您應該查看Joda Time ,這是一個常用來代替 Java 內置日期庫的庫。

Joda Time 中DateTime.Now的等價物是:

DateTime dt = new DateTime();

更新

如評論中所述,最新版本的 Joda Time 有一個DateTime.now()方法,因此:

DateTime dt = DateTime.now();

tl;博士

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 個字母的代碼,例如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,請使用Instant Instant對象表示時間軸上的一個時刻,以納秒分辨率表示,始終采用 UTC。 這提供了分區日期時間的構建塊,以及時區分配。 你可以從概念上這樣想:

ZonedDateTime =Instant + ZoneId

您可以從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();
import java.util.Date;   
Date now = new Date();

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

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.DateSimpleDateFormatter )不是線程安全的,這可能會導致並發問題。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM