UNIXタイムスタンプを日付オブジェクトに変換する必要があります。
私はこれを試しました:
java.util.Date time = new java.util.Date(timeStamp);
タイムスタンプ値は次のとおりです。 1280512800
日付は "2010/07/30-22:30:00"(PHPで取得した場合)である必要がありますが、代わりにを取得しThu Jan 15 23:11:56 IRST 1970
ます。
どのようにすればよいですか?
UNIXタイムスタンプを日付オブジェクトに変換する必要があります。
私はこれを試しました:
java.util.Date time = new java.util.Date(timeStamp);
タイムスタンプ値は次のとおりです。 1280512800
日付は "2010/07/30-22:30:00"(PHPで取得した場合)である必要がありますが、代わりにを取得しThu Jan 15 23:11:56 IRST 1970
ます。
どのようにすればよいですか?
回答:
の場合1280512800
、Javaはミリ秒を想定しているため、1000を掛けます。
java.util.Date time=new java.util.Date((long)timeStamp*1000);
すでにミリ秒があった場合は、 new java.util.Date((long)timeStamp);
ドキュメントから:
Dateオブジェクトを割り当て、それを初期化して、「エポック」と呼ばれる標準の基準時間、つまり1970年1月1日00:00:00 GMTからの指定されたミリ秒数を表します。
(long)
は非常に重要です。これがないと、整数がオーバーフローします。
java.util.Date
はクラスの完全修飾名です。クラスにパッケージをインポートする場合Date
、おそらくまったく同じですjava.util
。
Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
Java 8では、日付と時刻を操作するための新しいAPIであるjava.timeパッケージが導入されました。
java.timeを使用すると、UTCの1970年の最初の瞬間(1970-01-01T00:00Z)のエポックリファレンス以降の秒数を解析できます。結果はInstant
です。
Instant instant = Instant.ofEpochSecond( timeStamp );
java.timejava.util.Date
用にまだ更新されていない古いコードと相互運用する必要がある場合は、変換してください。古いクラスに追加された新しい変換メソッドを呼び出します。
Date date = Date.from( instant );
java.util.Date
です。古いクラスはレガシーであり、回避する必要があります。実際にレガシークラスとjava.timeクラスとの間で変換を行うことはできますが、可能な限りjava.timeを使用することをお勧めします。
カレンダーは新しい方法のようです:
Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));
最後の行は、それを使用する方法の例にすぎません。これは、たとえば「14.06.2012」と出力します。
System.currentTimeMillis()を使用してタイムスタンプを保存した場合、「* 1000」の部分は必要ありません。
文字列にタイムスタンプがある場合は、最初にlong.parseLong(timestamp)として解析する必要があります。
https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
timestamp
整数の場合、(long)
最初にキャストする必要があります。そうでない場合、誤った日付になります。mydate.setTimeInMillis((long) timestamp*1000);
java.util.Date
、java.util.Calendar
とjava.text.SimpleDateFormat
今のレガシーに取って代わられ、java.timeの後にJavaの8とに組み込まれたクラス。Oracleによるチュートリアルを参照してください。
Instant.ofEpochSecond( 1_280_512_800L )
2010-07-30T18:00:00Z
Java 8以降に組み込まれた新しいjava.timeフレームワークは、Joda-Timeの後継です。
これらの新しいクラスには、秒単位のカウントをエポックから変換するための便利なファクトリメソッドが含まれています。あなたが得るInstant
ナノ秒の分解能を上にして、UTCでタイムライン上の瞬間を。
Instant instant = Instant.ofEpochSecond( 1_280_512_800L );
instant.toString():2010-07-30T18:00:00Z
IdeOne.comでコードがライブで実行されていることを確認してください。
Asia/Kabul
またはAsia/Tehran
タイムゾーン?ここに表示されている18:00ではなく、22:30の時刻値を取得すると報告しました。PHPユーティリティがデフォルトのタイムゾーンを暗黙的に適用してUTCから調整しているのではないかと思います。ここでの私の値はUTCであり、で示されますZ
(の略でZulu
、UTCを意味します)。あなたのマシンのOSやPHPに設定されているすべての機会Asia/Kabul
やAsia/Tehran
時間帯?IRST
あなたが出力で報告しているように、それは明らかにイランの時間を意味していると思います。現在、2017年には、 UTCより4時間半進んでいる夏時間で動作する唯一のゾーンです。
指定適切なタイムゾーン名をの形式でcontinent/region
、のようなAmerica/Montreal
、Africa/Casablanca
またはPacific/Auckland
。など3-4文字の略語は絶対に使用しないでくださいEST
か、IST
またはIRST
そのままではない真の時間帯、標準化されていない、と(!)にも固有のものではありませんが。
特定の地域のタイムゾーンのレンズを通して自分の瞬間を見たい場合は、を適用してZoneId
を取得しZonedDateTime
ます。まだ同じ瞬間ですが、壁掛け時計の時間は異なります。
ZoneId z = ZoneId.of( "Asia/Tehran" ) ;
ZonedDateTime zdt = instant.atZone( z ); // Same moment, same point on timeline, but seen as different wall-clock time.
2010-07-30T22:30 + 04:30 [アジア/テヘラン]
新しいjava.timeクラスを使用する必要があります。ただし、必要に応じて古いものに変換できます。
java.util.Date date = java.util.Date.from( instant );
更新:Joda -Timeプロジェクトがメンテナンスモードになり、チームはjava.timeクラスへの移行をアドバイスします。
参考までに、Joda-Time DateTimeのコンストラクタは似ています。1000を掛けて、long
(int
!ではなく)を生成します。
DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );
悪名高い厄介なjava.util.Dateクラスと.Calendarクラスを回避するのが最善です。ただし、日付を使用する必要がある場合は、Joda-Timeから変換できます。
java.util.Date date = dateTime.toDate();
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.Date
、Calendar
、& SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換できます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。
別のマシンでタイムスタンプ値を変換する場合は、そのマシンのタイムゾーンも確認する必要があります。例えば;
上記の説明は、ESTまたはUTCタイムゾーンで実行した場合、異なる日付値になります。
タイムゾーンを設定するには、別名UTCの場合、単純に書き換えることができます。
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));
調整を行う必要がある場合があります。
長いキャストを使用しないでください!ナノ調整を使用します。
たとえば、取引にOanda Java APIを使用すると、日時をUNIX形式で取得できます。
例:1592523410.590566943
System.out.println("instant with nano = " + Instant.ofEpochSecond(1592523410, 590566943));
System.out.println("instant = " + Instant.ofEpochSecond(1592523410));
あなたが得る:
instant with nano = 2020-06-18T23:36:50.590566943Z
instant = 2020-06-18T23:36:50Z
また、使用:
Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());