現在の日時を取得する方法


342

Javaで現在の日時を取得するにはどうすればよいですか?

DateTime.NowC#に相当するものを探しています。


この質問は、以前は重複としてマークされていたこの質問よりも古いものです。そこで、指定を逆にして、この質問を再度開き、新しい質問を重複としてマークしました。
バジルブルク2016

回答:


414

Date引数なしで新しいオブジェクトを作成するだけです。これにより、現在の日付と時刻が新しいオブジェクトに割り当てられます。

import java.util.Date;

Date d = new Date();

引数なしのコンストラクターに関するJavadocの言葉で:

Dateオブジェクトを割り当て、初期化して、割り当てられた時間を表します。最も近いミリ秒単位で測定されます。

使用java.util.Dateしていないことを確認してください。java.sql.Date後者には引数なしのコンストラクタがなく、まったく異なる会話のトピックであるセマンティクスが多少異なります。:)


13
また、GregorianCalendarと多くの同様のオブジェクトが同じように機能することにも注意してください。したがって、使用している日付/カレンダーオブジェクトのタイプが何であれ、通常、ゼロ引数コンストラクターはオブジェクトを現在の日付/時刻に初期化します。
Peter Di Cecco、2010年

Date docから:JDK 1.1以降、カレンダークラスを使用して日付と時刻のフィールド間の変換を行い、DateFormatクラスを使用して日付文字列のフォーマットと解析を行う必要があります。
Paolo M

9
新しいJava8 APIを検討してください-LocalDateTime.now()およびZonedDateTime.now()
Oleg Mikheev

59

JavaのDateクラスとCalendarクラスは、設計が不十分であると多くの人が考えています。Javaの組み込み日付ライブラリの代わりに一般的に使用されるライブラリであるJoda Timeご覧ください。

DateTime.NowJoda Timeでの同等のものは次のとおりです。

DateTime dt = new DateTime();

更新

コメントで述べたように、Joda Timeの最新バージョンにはDateTime.now()メソッドがあります。

DateTime dt = DateTime.now();

4
Jodaの現在のバージョン(2.1)には、静的なDateTime.now method()があるようです(オプションでDateTimeZoneまたはChronologyを受け入れます)。joda-time.sourceforge.net/apidocs/org/joda/time/...
ローマA. Taycher

1
この回答は2010年に投稿されたことに注意してください。Java8は、Joda Timeの最高の機能の多くを吸収しています。詳細については、公式ドキュメントと他の多くのオンライン記事を参照してください。
DavidS 2016

36

tl; dr

Instant.now()

java.time

java.util.Dateクラスは、Java 8以降の新しいjava.timeパッケージチュートリアル)によって時代遅れになっています。古い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

一般に、すべてUTCタイムゾーンでバックエンドの作業(ビジネスロジック、データベース、ストレージ、データ交換)を行う習慣を身に付けた方がよいでしょう。上記のコードは、JVMの現在のデフォルトのタイムゾーンに暗黙的に依存しています。

Instantクラスはナノ秒の分解能でUTCでタイムラインの瞬間を表しています。

Instant instant = Instant.now();

Instantクラスはjava.timeにおける基本的なビルディング・ブロック・クラスであり、あなたのコード内で頻繁に使用することができます。

より柔軟なフォーマットが必要な場合は、に変換してくださいOffsetDateTimeZoneOffsetオブジェクトを指定します。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に留まるには、を使用しますInstantInstantオブジェクトは常にUTCで、ナノ秒の分解能に、タイムライン上の瞬間を表しています。これにより、タイムゾーンの割り当てとともに、ゾーン化された日時の構成要素が提供されます。あなたはそれを概念的にこのように考えることができます:

ZonedDateTime= Instant+ZoneId

Instantからを抽出できZonedDateTimeます。

Instant instantNow = zdt.toInstant();

インスタントから始めることができます。Instant常にUTCのように、ここでタイムゾーンを指定する必要はありません。

Instant now = Instant.now();

重複した質問の詳細を含む別の回答も投稿しました。
バジルブルク2016




10

java.lang.System.currentTimeMillis(); エポック以降の日時を返します


ロギングには適していますが、ユーザーに表示するには解析と変換が必要です
Rishi Dua


5

新しいDateオブジェクトを作成すると、デフォルトで現在の時刻に設定されます。

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

3

Javaは、日付と時刻のユースケースを常に十分にサポートしていません。たとえば、既存のクラス(java.util.DateおよびなどSimpleDateFormatter)はスレッドセーフではないため、同時実行の問題が発生する可能性があります。また、APIには特定の欠陥があります。たとえば、年はjava.util.Date1900から始まり、月は1から始まり、日は0から始まります。直感的ではありません。これらの問題により、などのサードパーティの日付と時刻ライブラリが人気を博しましたJoda-Time。新しい日時に対処するために、APIはJava SE 8用に設計されています。

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

ドキュメントに従って:

このメソッドnow()は、システムクロックとデフォルトのタイムゾーンを使用して、現在の日時を返します。nullではありません。デフォルトのタイムゾーンのシステムクロックから現在の日時を取得します。これにより、デフォルトのタイムゾーンでシステムクロックが照会され、現在の日時が取得されます。この方法を使用すると、クロックがハードコードされているため、テストに代替クロックを使用できなくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.