Javaで現在の年、月、日、時間、分、秒、ミリ秒を取得するにはどうすればよいですか?


104

Javaで現在の年、月、日、時間、分、秒、ミリ秒を取得するにはどうすればよいですか?として持っていたいStringsです。

回答:


254

のゲッターを使用できますjava.time.LocalDateTime

LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int millis = now.get(ChronoField.MILLI_OF_SECOND); // Note: no direct getter available.

System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);

または、Java 8をまだ使用していない場合は、を使用してくださいjava.util.Calendar

Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; // Note: zero based!
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
int millis = now.get(Calendar.MILLISECOND);

System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);

いずれにせよ、これは今のところ印刷されます:

2010-04-16 15:15:17.816

をに変換するintにはString、を利用しString#valueOf()ます。


結局のところ、人にやさしい文字列形式で配置して表示することが目的である場合は、Java8 java.time.format.DateTimeFormatterチュートリアルはこちら)のいずれかを使用することをお勧めします

LocalDateTime now = LocalDateTime.now();
String format1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
String format2 = now.atZone(ZoneId.of("GMT")).format(DateTimeFormatter.RFC_1123_DATE_TIME);
String format3 = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss", Locale.ENGLISH));

System.out.println(format1);
System.out.println(format2);
System.out.println(format3);

または、Java 8をまだ使用していない場合は、次を使用しますjava.text.SimpleDateFormat

Date now = new Date(); // java.util.Date, NOT java.sql.Date or java.sql.Timestamp!
String format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(now);
String format2 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH).format(now);
String format3 = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH).format(now);

System.out.println(format1);
System.out.println(format2);
System.out.println(format3);

いずれにせよ、これにより次の結果が得られます。

2010-04-16T15:15:17.816
2010年4月16日金曜日15:15:17 GMT
20100416151517

以下も参照してください。


printfを使用する場合は、中間ステップ、つまり「%1 $ tm%1 $ te、%1 $ tY」、c(java.util。完全な構文のフォーマッター)
M. Jessup '16

1
@M。ジェサップ:それは確かにいい。ただし、使用したことがないので頭の上からは入力できません。上記はデモ用です。とにかく、私はむしろその特定のタスクをつかむSimpleDateFormatDateTimeFormatter:)
BalusC 2010

joda-timeを使用することを強くお勧めします。それは、Javaが直接提供する不適切に設計された日付やカレンダーと比較して、はるかに素晴らしく理解しやすいAPIだからです。
海津2012

私はこれを特にstartTimeまたはendTimeを取得するためのi18n作業で好む:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Eddy

1
java.time機能の多くは、ThreeTen -BackportプロジェクトのJava 6および7にバックポートされています。
バジルブルク

30

joda-timeに切り替えると、これを3行で実行できます

DateTime jodaTime = new DateTime();

DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS");
System.out.println("jodaTime = " + formatter.print(jodaTime));

カレンダーを使用せずに、日付の個々のフィールドに直接アクセスすることもできます。

System.out.println("year = " + jodaTime.getYear());
System.out.println("month = " + jodaTime.getMonthOfYear());
System.out.println("day = " + jodaTime.getDayOfMonth());
System.out.println("hour = " + jodaTime.getHourOfDay());
System.out.println("minute = " + jodaTime.getMinuteOfHour());
System.out.println("second = " + jodaTime.getSecondOfMinute());
System.out.println("millis = " + jodaTime.getMillisOfSecond());

出力は次のとおりです。

jodaTime = 2010-04-16 18:09:26.060

year = 2010
month = 4
day = 16
hour = 18
minute = 9
second = 26
millis = 60

http://www.joda.org/joda-time/によると

Joda-Timeは、Javaの事実上の標準の日時ライブラリです。Java SE 8以降では、ユーザーはjava.time(JSR-310)への移行を求められます。


1
ちなみに、Joda-Timeプロジェクトは現在メンテナンス中で、そのチームはjava.timeクラスへの移行をアドバイスしています。Joda-Timeとjava.timeの両方は、同じ人物、Stephen Colebourneが率いています。
バジルブルク

7
    // Java 8
    System.out.println(LocalDateTime.now().getYear());       // 2015
    System.out.println(LocalDateTime.now().getMonth());      // SEPTEMBER
    System.out.println(LocalDateTime.now().getDayOfMonth()); // 29
    System.out.println(LocalDateTime.now().getHour());       // 7
    System.out.println(LocalDateTime.now().getMinute());     // 36
    System.out.println(LocalDateTime.now().getSecond());     // 51
    System.out.println(LocalDateTime.now().get(ChronoField.MILLI_OF_SECOND)); // 100

    // Calendar
    System.out.println(Calendar.getInstance().get(Calendar.YEAR));         // 2015
    System.out.println(Calendar.getInstance().get(Calendar.MONTH ) + 1);   // 9
    System.out.println(Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); // 29
    System.out.println(Calendar.getInstance().get(Calendar.HOUR_OF_DAY));  // 7
    System.out.println(Calendar.getInstance().get(Calendar.MINUTE));       // 35
    System.out.println(Calendar.getInstance().get(Calendar.SECOND));       // 32
    System.out.println(Calendar.getInstance().get(Calendar.MILLISECOND));  // 481

    // Joda Time
    System.out.println(new DateTime().getYear());           // 2015
    System.out.println(new DateTime().getMonthOfYear());    // 9
    System.out.println(new DateTime().getDayOfMonth());     // 29
    System.out.println(new DateTime().getHourOfDay());      // 7
    System.out.println(new DateTime().getMinuteOfHour());   // 19
    System.out.println(new DateTime().getSecondOfMinute()); // 16
    System.out.println(new DateTime().getMillisOfSecond()); // 174

    // Formatted
    // 2015-09-28 17:50:25.756
    System.out.println(new Timestamp(System.currentTimeMillis()));

    // 2015-09-28T17:50:25.772
    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(new Date()));

    // Java 8
    // 2015-09-28T17:50:25.810
    System.out.println(LocalDateTime.now());

    // joda time
    // 2015-09-28 17:50:25.839
    System.out.println(DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS").print(new org.joda.time.DateTime()));

この回答は、日付/時刻値のコンポーネント(通常のフォーマットされた文字列ではない)へのアクセスについて尋ねられた質問に実際に対応しています。
バジルブルク2015

6

Java 8以降では、java.timeパッケージを使用します

ZonedDateTime.now().getYear();
ZonedDateTime.now().getMonthValue();
ZonedDateTime.now().getDayOfMonth();
ZonedDateTime.now().getHour();
ZonedDateTime.now().getMinute();
ZonedDateTime.now().getSecond();

ZonedDateTime.now()デフォルトのタイムゾーンでシステムクロックから現在の日時を返す静的メソッドです。すべてのgetメソッドはint値を返します。


LocalDateTimeこれはまさに間違ったクラスです。タイムゾーンのいずれかの概念を欠いているか、オフセットから-UTC、それはできません特定の瞬間を追跡するために使用され、それがないタイムライン上のポイント。使用InstantZonedDateTimeまたはOffsetDateTimeその代わり。
バジルブルク

あなたが正しい。を使用するように回答を変更しましたZonedDateTime
Ortomala Lokni

3

tl; dr

ZonedDateTime.now(                    // Capture current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
    ZoneId.of( "America/Montreal" )   // Specify desired/expected time zone. Or pass `ZoneId.systemDefault` for the JVM’s current default time zone.
)                                     // Returns a `ZonedDateTime` object.
.getMinute()                          // Extract the minute of the hour of the time-of-day from the `ZonedDateTime` object.

42

ZonedDateTime

特定の地域(タイムゾーン)の人々が使用する実時間で表示される現在の瞬間をキャプチャするには、を使用しますZonedDateTime

日付を決定するには、タイムゾーンが重要です。いつでも、日付は世界中でゾーンごとに異なります。たとえば、パリの真夜中から数分後のフランスは新しい日ですが、モントリオールケベックでは「昨日」です。

タイムゾーンが指定されていない場合、JVMは暗黙的に現在のデフォルトのタイムゾーンを適用します。そのデフォルトは実行時(!)のどの時点でも変わる可能性があるため、結果は異なる場合があります。引数として希望/予想タイムゾーンを明示的に指定することをお勧めします。

指定適切なタイムゾーン名をの形式でcontinent/region、のようなAmerica/MontrealAfrica/CasablancaまたはPacific/Auckland。決してなど3-4文字の略称を使用していないESTか、ISTそのままではない真の時間帯ではなく、標準化、さらには一意ではありません(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

多くのゲッターのいずれかを呼び出して、日時の一部を引き出します。

int    year        = zdt.getYear() ;
int    monthNumber = zdt.getMonthValue() ;
String monthName   = zdt.getMonth().getDisplayName( TextStyle.FULL , Locale.JAPAN ) ;  // Locale determines human language and cultural norms used in localizing. Note that `Locale` has *nothing* to do with time zone.
int    dayOfMonth  = zdt.getDayOfMonth() ;
String dayOfWeek   = zdt.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; 
int    hour        = zdt.getHour() ;  // Extract the hour from the time-of-day.
int    minute      = zdt.getMinute() ;
int    second      = zdt.getSecond() ;
int    nano        = zdt.getNano() ;

java.timeのクラスはに解決ナノ秒。あなたの質問はミリ秒の秒の端数を尋ねました。明らかに、100万で割り、ナノ秒からミリ秒に切り捨てることができますが、データが失われる可能性があります。またはTimeUnit、そのような変換には列挙型を使用します。

long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;

DateTimeFormatter

Stringテキストを組み合わせるためのを生成するには、DateTimeFormatterクラスを使用します。詳細については、スタックオーバーフローを検索してください。

Instant

通常、UTCで瞬間を追跡するのが最適です。ゾーン化された日時からUTCに調整するには、を抽出しInstantます。

Instant instant = zdt.toInstant() ;

そして再び戻ってください。

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Africa/Tunis" ) ) ;

LocalDateTime

他のいくつかの回答がLocalDateTimeクラスを使用しています。このクラスは、タイムゾーンやUTCからのオフセットの概念を意図的に欠いているため、実際の瞬間、タイムライン上の特定の瞬間を追跡する目的には適していません。

それで、何がLocalDateTime良いのですか?特定の1つの地域ではなく、任意の地域またはすべての地域LocalDateTime日付と時刻を適用する場合に使用します。

たとえば、今年のクリスマスはで始まりLocalDateTime.parse( "2018-12-25T00:00:00" )ます。その値は、タイムゾーン(a ZoneId)を適用してを取得するまで意味がありませんZonedDateTime。クリスマスは最初にキリバスで行われ、その後ニュージーランドと極東アジアで行われます。数時間後、クリスマスはインドで始まります。アフリカとヨーロッパではさらに1時間後。そして、まだ数時間後までアメリカ大陸のクリスマスではありません。1つの場所で始まるクリスマスは、で表す必要がありZonedDateTimeます。どこでもクリスマスはで表されますLocalDateTime


java.timeについて

java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.DateCalendar、& SimpleDateFormat

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。

詳細については、Oracleチュートリアルを参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。

java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*

java.timeクラスはどこで入手できますか?


2

または、java.sql.Timestampを使用します。カレンダーはやや重いので、量産コードでは使用しないことをお勧めします。ジョーダは良いです。

import java.sql.Timestamp;

public class DateTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(new Timestamp(System.currentTimeMillis()));
    }
}

質問とsqlタイムスタンプの使用の両方を誤解していると思います。通常はnew Date()ここで使用します。しかし、要求に応じてどのようにして個別のパーツを簡単に入手できますか?
BalusC 2010

参考までjava.sql.Timestampjava.time.Instant、JDBC 4.2の登場によりに取って代わられました。
バジルブルク

0

Java 7カレンダーの1行

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())

1
面倒なCalendarクラスとSimpleDateFormatクラスは古くなり、java.timeクラスに完全に取って代わられました。最新のアプローチについては、BalusCによる回答を参照してください。java.time機能の多くは、ThreeTen -BackportプロジェクトのJava 6および7にバックポートされています。
バジルブルク

-2

java.util.Calendarクラスとその派生物のAPIドキュメントをご覧ください(GregorianCalendarクラスに特に興味があるかもしれません)。


FYI、といった面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeの後にJavaの8とに組み込まれたクラス。Oracleによるチュートリアル参照してください。
バジルブルク

-2

Calendar now = new Calendar()//または新しいGregorianCalendar()、または必要なフレーバー

now.MONTH now.HOUR


3
こんにちは、私はなぜあなたがすでに与えられた答えを悪い方法で繰り返すのか理解するのに苦労しています。詳しく説明してください:)
BalusC 2010

3
MONTHおよびのHOUR静的定数でありCalendar、インスタンスプロパティではありません。
Joseph Earl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.