注、私はEpochからミリが欲しくない。現在クロックにあるミリ秒数が欲しいのです。
だから、例えば、私はこのコードを持っています。
Date date2 = new Date();
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);
日付をミリ秒単位で取得する方法はありますか?これを行う別の方法はありますか?
注:System.currentTimeMillis()
は私にEpochからミリを与えます。
という意味ですか?
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.
カレンダーを使用
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境界上にないエポックで定義されていない限り。
Calendar.getInstance().get(Calendar.MILLISECOND);
私は上記のいくつかを試したが、彼らは@ 1000をリセットするようだ
これは間違いなく機能し、また年を考慮に入れるべきです
long millisStart = Calendar.getInstance().getTimeInMillis();
その後、必要に応じて終了時にも同じ操作を行います。
現在時刻の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
これを参照してください IdeOne.comでライブで実行されているコード 。
現代的な方法はJava.timeクラスを使うことです。
UTCで現在の瞬間を捉えます。
Instant.now()
TemporalField
の値を調べるには、Instant.get
メソッドを使用します。私たちの場合、欲しい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万で割って細かいデータを切り捨てます。たとえば、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 8以降に組み込まれています。これらのクラスは、 Java.util.Date
、 Calendar
、& SimpleDateFormat
などの厄介な古い レガシー 日時クラスに代わるものです。
Joda-Time プロジェクトは、現在は メンテナンスモード になっており、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracleチュートリアル を参照してください。そして多くの例と説明についてはStack Overflowを検索してください。指定は JSR 310 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加クラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明するものです。 Interval
、 YearWeek
、 YearQuarter
、 more など、便利なクラスがいくつかあります。
long timeNow = System.currentTimeMillis();
System.out.println(new Date(timeNow));
金Apr 04 14:27:05 PDT 2014
これを行うには、 Joda-Time を使用できると思います。 DateTime
クラスとその getMillisOfSecond
メソッドを見てください。何かのようなもの
int ms = new DateTime().getMillisOfSecond() ;
Java 8では、単純にできること
ZonedDateTime.now().toInstant().toEpochMilli()
戻り値:1970-01-01T00のエポック以降のミリ秒数:00:00Z
私は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));
}