JavaでYYYY-MM-DD HH:MI:Sec.Millisecond形式で現在の時刻を取得する方法


641

以下のコードは私に現在の時間を与えます。ただし、ミリ秒については何もわかりません。

public static String getCurrentTimeStamp() {
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//dd/MM/yyyy
    Date now = new Date();
    String strDate = sdfDate.format(now);
    return strDate;
}

2009-09-22 16:47:08 (YYYY-MM-DD HH:MI:Sec)の形式で日付を取得します。

しかし、現在の時刻を2009-09-22 16:47:08.128((YYYY-MM-DD HH:MI:Sec.Ms)- という形式で取得したいと思います。ここで、128はミリ秒を示します。

SimpleTextFormat正常に動作します。ここで時間の最小単位は秒ですが、ミリ秒も取得するにはどうすればよいですか?


32
他のすべてが失敗した場合は、ドキュメントをお読みください。
Hot Licks、2014年

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

回答:


1003
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

好奇心から、SimpleDateFormatを使用するとどのようなメリットがありますか:dateTime.ToString( "yyyy-MM-dd HH:mm:ss.SSS")?
NickG 2013年

10
@NickGこのtoString(String format)メソッドはどこにありますか?java.util.Dateそれを持っていないようです。Joda Time APIを参照していますか?ただし、考えられる利点の1つは、同じフォーマッターオブジェクトを再利用できることです。もう1つは、APIを追加する必要がないことです。Dateクラスは標準のJavaライブラリクラスです。
ADTC 2013

22
Java 8では、同じ目的でDateTimeFormatterを使用できます。
Vitalii Fedorenko 2014

7
SimpleDateFormatはスレッドセーフではありませんが、新しいDateTimeFormatterはスレッドセーフです。
devdanke 2017年

15
Java 8日時APIの使用:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha '14

202

Javaワンライナー

public String getCurrentTimeStamp() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());
}

JDK8スタイル

public String getCurrentLocalDateTimeStamp() {
    return LocalDateTime.now()
       .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
}

9
LocalDateTimeとDateTimeFormatterは、SimpleDateFormatとは異なりスレッドセーフです
Maxple

@Maxple SimpleDateFormatが問題を引き起こすケースはありますか?
gaurav

1
@gauravはここにあなたのcookieがあります:callicoder.com/java-simpledateformat-thread-safety-issues
kidnan1991



31

tl; dr

Instant.now()
       .toString()

2016-05-06T23:24:25.694Z

ZonedDateTime
.now
( 
    ZoneId.of( "America/Montreal" ) 
)
.format(  DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " )

2016-05-06 19:24:25.694

java.time

Java 8以降では、java.timeフレームワークがJava 8以降に組み込まれています。これらの新しいクラスは、面倒な古いjava.util.Date/.Calendarクラスに取って代わります。新しいクラスは非常に成功したJoda-Timeフレームワークに触発されたもので、後継として意図されており、概念は似ていますが再構築されています。JSR 310で定義されています。ThreeTen-Extraプロジェクトによって拡張されました。チュートリアルを参照してください。

java.util.DateとJoda-Timeの両方のミリ秒の精度(小数点以下3桁)に対して、java.timeはナノ秒の精度(小数点以下9桁)に対応していることに注意してください。したがって、小数点以下3桁のみを表示するようにフォーマットすると、データが非表示になる可能性があります。

データからマイクロ秒またはナノ秒を削除する場合は、切り捨てます。

Instant instant2 = instant.truncatedTo( ChronoUnit.MILLIS ) ;

java.timeクラスは、文字列の解析/生成時にデフォルトでISO 8601形式を使用します。Z末尾のA はの略でZuluUTCを意味します。

アンはInstant、最大の分解能でUTCでタイムライン上の瞬間を表しナノ秒。Java 8の現在の瞬間のキャプチャはミリ秒に制限されています。Java9の新しい実装では、コンピューターのハードウェアクロックの能力に応じて、最大でナノ秒をキャプチャします。

Instant instant = Instant.now (); // Current date-time in UTC.
String output = instant.toString ();

2016-05-06T23:24:25.694Z

T真ん中のをスペースで置き換え、Zを何も入れないで、目的の出力を取得します。

String output = instant.toString ().replace ( "T" , " " ).replace( "Z" , "" ; // Replace 'T', delete 'Z'. I recommend leaving the `Z` or any other such [offset-from-UTC][7] or [time zone][7] indicator to make the meaning clear, but your choice of course.

2016-05-06 23:24:25.694

オフセットやタイムゾーンを含める必要がないので、特定の地域に関係のない「現地」の日時を作成します。

String output = LocalDateTime.now ( ).toString ().replace ( "T", " " );

ジョーダタイム

非常に成功したJoda-Timeライブラリは、java.timeフレームワークのインスピレーションでした。都合のよいときにjava.timeに移行することをお勧めします。

ISO 8601形式は、ミリ秒を含み、かつ、デフォルトでジョダタイム 2.4ライブラリ。

System.out.println( "Now: " + new DateTime ( DateTimeZone.UTC ) );

実行すると…

Now: 2013-11-26T20:25:12.014Z

また、必要に応じて、ミリ秒の端数を数値として要求することもできます。

int millisOfSecond = myDateTime.getMillisOfSecond ();

9

私はこのようなものを使用します:

String.format("%tF %<tT.%<tL", dateTime);

変数dateTimeは任意の日付および/または時刻の値である可能性があります。JavaDocをFormatter参照してください。


9

最も簡単な方法は、(Java 8より前の)使用です。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

ただし、SimpleDateFormatはスレッドセーフではありません。java.util.Dateでもありません。これは、ユーザーにとって潜在的な同時実行性の問題につながります。そして、それらの既存の設計には多くの問題があります。これらをJava 8で克服するために、java.timeと呼ばれる別のパッケージがあります。このJava SE 8の日付と時刻のドキュメントには、概要がわかります。

したがって、Java 8では、次のようなものが(現在の日付/時刻をフォーマットするために)トリックを実行します。

LocalDateTime.now()
   .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

また、注目すべきは、サードパーティの人気ライブラリであるjoda-timeを利用して開発されたことです。

このプロジェクトは、Joda-Time(Stephen Colebourne)の作者とOracleが共同でJSR 310のもとで主導しており、新しいJava SE 8パッケージjava.timeに登場します。

しかし、今 joda-timeは非推奨になり、ユーザーにnewへの移行を求めていますjava.time

Java SE 8以降では、ユーザーはjava.time(JSR-310)に移行するように求められます-このプロジェクトに代わるJDKの中核部分

とにかく、

Calendarインスタンスがある場合は、以下を使用して新しいに変換できますjava.time

    Calendar calendar = Calendar.getInstance();
    long longValue = calendar.getTimeInMillis();         

    LocalDateTime date =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());
    String formattedString = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(date.toString()); // 2018-03-06T15:56:53.634
    System.out.println(formattedString); // 2018-03-06 15:56:53.634

Dateオブジェクトがある場合、

    Date date = new Date();
    long longValue2 = date.getTime();

    LocalDateTime dateTime =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue2), ZoneId.systemDefault());
    String formattedString = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(dateTime.toString()); // 2018-03-06T15:59:30.278
    System.out.println(formattedString);     // 2018-03-06 15:59:30.278

エポックミリ秒があった場合、

LocalDateTime date =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault());

最小APIレベルは26
AbhinayMe '30

4

上記の回答を補足するために、ミリ秒を含む現在の時刻と日付を出力するプログラムの小さな実際の例を次に示します。

import java.text.SimpleDateFormat;
import java.util.Date;

public class test {
    public static void main(String argv[]){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date now = new Date();
        String strDate = sdf.format(now);
        System.out.println(strDate);
    }
}


2

これを使用して、指定した形式で現在の時刻を取得します。

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 System.out.print(dateFormat.format(System.currentTimeMillis()));  }

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

実際、私はAndroidアプリにこのソリューションを使用していましたが、AndroidでJava.timeクラスを使用するには、APIを少なくとも27に設定する必要があります。とにかく情報を共有していただきありがとうございます。
Abhishek Sengupta

ほとんどすべてのjava.time機能は、実質的に同じAPIを使用して、ThreeTen-BackportプロジェクトのJava 6および7にバックポートされています。ThreeTenABPプロジェクトでAndroid <26にさらに適合。したがって、これらの流血のひどい古い日時クラスに再び触れる必要はありません。
バジルブルク

2

ここにミリ秒で日付と時刻を表示する簡単な例があります......

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class MyClass{

    public static void main(String[]args){
        LocalDateTime myObj = LocalDateTime.now();
        DateTimeFormatter myFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS);
        String forDate = myObj.format(myFormat);
        System.out.println("The Date and Time are: " + forDate);
    }
}

よさそうですが、たとえば、rsinhaの5年前のコメントに対する洞察は追加されますか?
greybeard


1

回答:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
ZonedDateTime start = Instant.now().atZone(ZoneId.systemDefault());
String startTimestamp = start.format(dateFormatter);


0

java.text(java 8より前)

public static ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    };
};

...
dateFormat.get().format(new Date());

java.time

public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

...
dateTimeFormatter.format(LocalDateTime.now());

-1

あなたは単にあなたが望むフォーマットでそれを得ることができます。

String date = String.valueOf(android.text.format.DateFormat.format("dd-MM-yyyy", new java.util.Date()));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.