web-dev-qa-db-ja.com

現在の午前0時からのミリ秒数を取得する方法を教えてください。

注、私はEpochからミリが欲しくない。現在クロックにあるミリ秒数が欲しいのです。

だから、例えば、私はこのコードを持っています。

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

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

注:System.currentTimeMillis()は私にEpochからミリを与えます。

122
Lemonio

という意味ですか?

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.
194
Peter Lawrey

カレンダーを使用

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境界上にないエポックで定義されていない限り。

24
Calendar.getInstance().get(Calendar.MILLISECOND);
16
kgautron

私は上記のいくつかを試したが、彼らは@ 1000をリセットするようだ

これは間違いなく機能し、また年を考慮に入れるべきです

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

その後、必要に応じて終了時にも同じ操作を行います。

12

tl; dr

現在時刻の1秒未満の分数をミリ秒数で指定します(notEpochからのカウント)。

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. ミリ秒(千)に切り捨てるには、千で割ってください。

これを参照してください IdeOne.comでライブで実行されているコード

Java.timeを使う

現代的な方法はJava.timeクラスを使うことです。

UTCで現在の瞬間を捉えます。

Instant.now()

TemporalField の値を調べるには、Instant.getメソッドを使用します。私たちの場合、欲しいTemporalFieldChronoField.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万で割って細かいデータを切り捨てます。たとえば、1/2秒は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 などの厄介な古い レガシー 日時クラスに代わるものです。

Joda-Time プロジェクトは、現在は メンテナンスモード になっており、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracleチュートリアル を参照してください。そして多くの例と説明についてはStack Overflowを検索してください。指定は JSR 310 です。

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

  • Java SE 8 および SE 9 以降
    • ビルトイン。
    • バンドル実装の標準Java APIの一部。
    • Java 9では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6 および SE 7
    • Java.time機能の多くは、 ThreeTen-Backport でJava 6および7にバックポートされています。
  • Android

ThreeTen-Extra プロジェクトは、追加クラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明するものです。 IntervalYearWeekYearQuartermore など、便利なクラスがいくつかあります。

11
Basil Bourque
  1. long timeNow = System.currentTimeMillis();
  2. System.out.println(new Date(timeNow));

金Apr 04 14:27:05 PDT 2014

4
omarflorez

ジョダタイム

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

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

Java 8では、単純にできること

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

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

0
Aniket Thakur

私は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
Aldo Infanzon