現在の午前0時からのミリ秒数を取得するにはどうすればよいですか?


125

エポックからのミリ秒は必要ないことに注意してください。現在時計のミリ秒数が欲しい。

たとえば、私はこのコードを少し持っています。

Date date2 = new Date(); 
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);

日付でミリ秒を取得する方法はありますか?これを行う別の方法はありますか?

注: System.currentTimeMillis()私が探しているものではないエポックから数ミリを与えます。


2
つまり、「ミリ秒単位」なので、値は常に間隔内[0, 999]にありますよね?@thinksteepが最後の文を読んでください。
マットボール

@Lemonio例を挙げれば、質問がより明確になります。
バジルブルク2015年

参考までに、java.timeクラスに取って代わった、java.util.Date今ではレガシーなどの厄介な古い日時クラス。
バジルブルク2017

参考までに、java.timeクラスに取って代わった、java.util.Date今ではレガシーなどの厄介な古い日時クラス。Oracleによるチュートリアルを参照してください。
バジルブルク2017

1
@ChrisNeve JEP 150Brian Goetzによって承認され、JSR 310 は満場一致採用されました。これはOracleが発行した技術記事であり、古い日時Oracleチュートリアルを新しいjava.timeチュートリアルに置き換えました
バジルブルク

回答:


198

もしかして?

long millis = System.currentTimeMillis() % 1000;

ところで、Windowsは1969年までのタイムトラベルを許可していません

C:\> date
Enter the new date: (dd-mm-yy) 2/8/1969
The system cannot accept the date entered.

8
Unixエポック以前に時間を遡ると、負の値になりますが、使用するc.get(Calendar.MILLISECOND)べきではありません。常にコーナーケースを考えてください!
Jon Skeet

そして、誰かが2番目の境界にないタイムゾーンを定義するか、うるうミリ秒を追加すると、これは壊れます。=))
Markus Mikkolainen

35
Javaはタイムトラベルをサポートしていません。
R.マルティーニョフェルナンデス

1
@MarkusMikkolainen:いいえ、System.currentTimeMillis()タイムゾーンの影響を受けません。
Jon Skeet、2012

1
@PeterLawrey:まあ、そうかもしれないし、そうでないかもしれない。それは実装次第です。日付のドキュメントから:「秒は0から61までの整数で表されます。値60と61はうるう秒でのみ発生し、実際にはうるう秒を実際に追跡するJava実装でのみ発生します。秒が現在導入されていますが、同じ分で2つのうるう秒が発生することはほとんどありませんが、この仕様はISO Cの日付と時刻の規則に従っています。
Jon Skeet、2012

25

カレンダーを使用

Calendar.getInstance().get(Calendar.MILLISECOND);

または

Calendar c=Calendar.getInstance();
c.setTime(new Date()); /* whatever*/
//c.setTimeZone(...); if necessary
c.get(Calendar.MILLISECOND);

実際には、ほぼ常にSystem.currentTimeMillis()%1000に等しいと思います。誰かがうるうミリ秒を持っているか、カレンダーが第2境界にないエポックで定義されている場合を除きます。


カレンダーはデフォルトですでに現在の時刻であり、MILLISECONDにははありません。
kgautron


13

tl; dr

現在の時間の1秒の端数をミリ秒数で要求します(エポックから数えません)。

Instant.now()                               // Get current moment in UTC, then…
       .get( ChronoField.MILLI_OF_SECOND )  // interrogate a `TemporalField`.

2017-04-25T03:01:14.113Z→ 113

  1. ナノ秒(10億)単位の小数秒を取得します。
  2. 1000で割り、ミリ秒(千)に切り捨てます。

IdeOne.comでこのコードがライブで実行されるのを確認してください

java.timeの使用

最新の方法は、java.timeクラスを使用する方法です。

UTCで現在の瞬間をキャプチャします。

Instant.now()

Instant.getメソッドを使用して、の値を問い合わせますTemporalField。私たちの場合、TemporalField必要なのはChronoField.MILLI_OF_SECONDです。

int millis = Instant.now().get( ChronoField.MILLI_OF_SECOND ) ;  // Get current moment in UTC, then interrogate a `TemporalField`.

またはあなた自身で数学をしてください。

特定のタイムゾーンでこれを要求している可能性が高くなります。秒の端数はと同じである可能性が高いですが、Instantタイムゾーンに非常に多くの異常があるため、私はその仮定をためらいます。

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

小数秒を問い合わせます。質問はミリ秒を要求しましたが、java.timeクラスはナノ秒のより細かい分解能を使用します。つまり、ナノ秒数の範囲は0〜999,999,999です。

long nanosFractionOfSecond = zdt.getNano();

本当にミリ秒が必要な場合は、100万で割ってより細かいデータを切り捨てます。たとえば、0.5秒は500,000,000ナノ秒であり、500ミリ秒でもあります。

long millis = ( nanosFractionOfSecond / 1_000_000L ) ;  // Truncate nanoseconds to milliseconds, by a factor of one million.

java.timeについて

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

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

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

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

ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがIntervalYearWeekYearQuarter、および多くを


12

上記のいくつかを試しましたが、@ 1000にリセットされているようです

これは間違いなく機能し、年も考慮する必要があります

long millisStart = Calendar.getInstance().getTimeInMillis();

必要に応じて、終了時間についても同じようにします。


1
間違った質問に答える。これは、現在のミリ秒の部分ではなく、エポックからの現在のミリ秒です。
Sean Van Gorder


2

ジョーダタイム

これにはJoda-Timeを使用できると思います。DateTimeクラスとそのgetMillisOfSecondメソッドを見てください。何かのようなもの

int ms = new DateTime().getMillisOfSecond() ;

コンパイルエラー:「getMillis()アクセスが保護されています」; get()代わりに使用する必要があります。また、これnew DateTime(new Date())は単に書くことと同じですnew DateTime()
Jonik、2015

このメソッドmillisOfSecondはオブジェクトにアクセスし、さらにそのオブジェクトからgetプリミティブを抽出するための呼び出しを行いintます。2つの呼び出しは、便利なgetterメソッドを使用して折りたたむことができgetMillisOfSecondます。Joda-Timeは、その特性の多くでこのパターンに従います。
バジルブルク2015年

1
FYI、ジョダタイムプロジェクトは、今でメンテナンスモードへの移行を助言チームと、java.timeのクラス。
バジルブルク2017

0

Java 8では簡単にできます

ZonedDateTime.now().toInstant().toEpochMilli()

戻り値:1970-01-01T00:00:00Zのエポックからのミリ秒数


1
[A]これは質問が求めたものではありません。彼らはエポック基準日からのミリ秒のカウントを望んでいないと明確に述べています。[B] ZonedDateTimeをドロップすることで、これを短縮できます:Instant.now().toEpochMilli()
バジル

0

私はjava 8を使用してテストを行いました。ビルダーが常に0ミリ秒かかり、26〜33ミリ秒の連結と1000連結の反復の順序は問題ではありません。

それがあなたのアイデアで試してくれることを願っています

public void count() {

        String result = "";

        StringBuilder builder = new StringBuilder();

        long millis1 = System.currentTimeMillis(),
            millis2;

        for (int i = 0; i < 1000; i++) {
            builder.append("hello world this is the concat vs builder test enjoy");
        }

        millis2 = System.currentTimeMillis();

        System.out.println("Diff: " + (millis2 - millis1));

        millis1 = System.currentTimeMillis();

        for (int i = 0; i < 1000; i++) {
            result += "hello world this is the concat vs builder test enjoy";
        }

        millis2 = System.currentTimeMillis();

        System.out.println("Diff: " + (millis2 - millis1));
    }

0

Java 8:

LocalDateTime toDate = LocalDateTime.now();
LocalDateTime fromDate = LocalDateTime.of(toDate.getYear(), toDate.getMonth(), 
toDate.getDayOfMonth(), 0, 0, 0);
long millis = ChronoUnit.MILLIS.between(fromDate, toDate);

1
一部のタイムゾーンでは機能しません。一部のゾーンでは、一部の日付では、その日の開始が00:00:00にならない場合があります。また、1日は24時間ではなく、数時間または数分追加またはスキップされる場合があります。LocalDateTimeクラスは、タイムゾーンのいずれかの概念を欠いている、瞬間を表現したり、オフセットから-UTC、したがって、これらのタイムゾーンの問題を追跡することはできませんすることはできません。
バジルブルク

0

java.util.Calendarクラスを使用して、ミリ秒単位で時間を取得できます。例:

Calendar cal = Calendar.getInstance();
int milliSec = cal.get(Calendar.MILLISECOND);
// print milliSec

java.util.Date date = cal.getTime();
System.out.println("Output: " +  new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(date));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.