Javaで「unixtime」を取得する


258

Date.getTime()は1970年1月1日からミリ秒を返します。Unixtimeは1970年1月1日からの秒数です。私は通常Javaでコーディングしませんが、いくつかのバグ修正に取り組んでいます。私が持っています:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

Javaでunixtimeを取得するより良い方法はありますか?


27
これをintにキャストしたので、2038年問題(UNIXのY2Kに相当)が発生しました。Unixエポックが20億に達し、ネガティブにロールオーバーするのはこのときです。修正は、64ビットUnixに移行することです。Javaの同等物は、それを長いままにすることです。
John M

1
はい、承知しています。これがインターフェースしているコードは、unixtimeに32ビット整数を期待しています。
ゲイリーリチャードソン

157
2038年はもうすぐです。
パセリエ2012年

currentTimeMillisの適切な名前または標準はありますか?ドキュメントでは、ミリ秒バージョンのUNIX時間と呼んでいます。
トム

1
ソフトウェアがオーバーフローを乗り越えたい場合はlong、ではなくを使用してくださいintint1秒= 4秒などの異なる細分度を使用している場合を除き、タイムスタンプを使用する理由は実際にはありません。どちらか、またはコードを非表示にして、将来の世代が自分がどれほど無能であったかを確認できないようにします。
bryc 2018

回答:


475

System.currentTimeMillis()による Dateオブジェクトの作成を回避する。1000で除算すると、Unixエポックになります。

コメントで述べたように、通常、unixTime変数の型には、ボックス化されたオブジェクトlong(大文字のL Long)ではなく、プリミティブlong(小文字のl long)が必要です。

long unixTime = System.currentTimeMillis() / 1000L;

3
また、あなたがオブジェクトとして数を処理する場合を除き、再び不必要なオブジェクトの作成を回避し、(コレクションにそれを置くように)、プリミティブ使用して長いの代わりにロングにオートボクシングを検討
brabster

9
Java 32ビットintは、32ビットプラットフォーム(および2038年問題)と一致します。64ビットプラットフォームでは、より大きなtime_tデータ型を使用します。Javaは、System.currentTimeMillis()の戻り値としてlongを使用して、この弾丸を回避しました。intに変換すると、2038年の問題が再び発生します。en.wikipedia.org/wiki/Year_2038_problem#Solutionsを
John M

1
このような数値リテラルで使用する場合、小文字の「L」と大文字の「L」に違いはありません。 docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
マットフォーサイス2014

5
大文字の説明(上記で明確化)はデータ型に関するものでした。プリミティブ「long」と「java.lang.Long」のクラスインスタンス。あなたは長いリテラルのサフィックス文字について話している、それは大文字でも小文字でもよいことに同意する。小文字の "l"は数字の "1"によく似ているので、大文字の "L"を使用すると読みやすくなります。
John M 14

1
ドキュメントへのリンクをクリックします。戻り値は、UTCタイムゾーンでの1970年1月1日からのミリ秒数として定義されます。タイムゾーンが欲しい?java.util.Calendarを見てください。
John M

273

Java 8は、日付と時刻を操作するための新しいAPIを追加しました。Java 8を使用すると、

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()現在のシステム時刻を表すインスタントを返します。を使用getEpochSecond()すると、からエポック秒(UNIX時間)を取得できますInstant


4
どのような違いがありInstant.now().getEpochSecond()new Date().getTime()そしてSystem.currentTimeMillis()
SohamC

2
1つの違いは、前者は秒単位であり、後者の2つはミリ秒単位であるということです。他にもあるかもしれません。
super_aardvark

3
import java.time.InstantScalaにいる場合
akauppi

4
詳細な説明については、このサイトも確認してください...いいね... currentTimeMillis
Subroto

1
古いAndroid APIレベルではこのメソッドを使用できないことに注意してください。
Ali Nadalizadeh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.