2

だから私はJavaのCalendar/Time/Dateにちょっと慣れていませんが、ネットでそれらについてたくさん読んだことがあります。

これが私がしなければならないことです:

Avl データ パケットを Communication Server に送信する外部デバイスがあり、データ部分の解析プロセスを実行しています。

データ パケットのどこかで、デバイスは 32 ビットのタイムスタンプを送信し、これを解析して、GPS からのポイントのレコードが保存された時刻に変換する必要があります。

タイムスタンプは、2007.01.01 00:00 UTC からの秒数を示します

ここに、残りの実験で試した中で最も近いと感じたサンプル コードを示します。

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS");

    long now = (long)(TimeStampSeconds.longValue() * 1000);

    Calendar calendar = Calendar.getInstance();
    calendar.clear();
    calendar.set(2007, 0, 1);
    calendar.setTimeInMillis(now);

    System.out.println(now + " = " + formatter.format(calendar.getTime()));

その後、calendar.set が新しいエポックを作成しないため、.setTimeInMills が機能しないことがわかりました。ただし、次のようなクレイジーな結果が得られます。

バイナリ タイムスタンプ: 0000101011000001010110001111011100001111

秒: 46193506063

46193506063000 = 25/10/3433 04:27:43.000

1970 年から 2007 年までの 37 年間だけを見逃してはいけませんか??

デバイスから取得した秒数から時間を見つける方法を見つけたいのですが、それらのエポックは 1/1/2007 で、Java のエポックは 1/1/1970 です。

編集: 私が欲しいのは、time:1/1/2007 プラス タイムスタンプの時間です。質問が少し明確になったことを願っています..

誰か何かアイデア?? 事前にThx

4

4 に答える 4

1

あなたがしたいのは、あなたのnow価値をに加えることだけのようCalendarです。これは簡単に実行できます。

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS");

long now = (long)(TimeStampSeconds.longValue() * 1000);

Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(2007, 0, 1);
calendar.setTimeInMillis(calendar.getTimeInMillis() + now);

System.out.println(now + " = " + formatter.format(calendar.getTime()));

編集

nowあなたの変数が何を保持するかに関して何かが奇妙です。この時間変換器によると46193506063 seconds対応します。 1464.786468258 years

于 2012-09-20T13:49:32.223 に答える
1

あなたが長い変数の入力を読んだと仮定するとtimestamp、私は次のようなことをします:

Calendar theirEpoch = Calendar.getInstance();
theirEpoch.set(2007, 0, 1);
Calendar myEpoch = Calendar.getInstance();
myEpoch.set(1970, 0, 1);
long difference = myEpoch.getTimeInMillis() - theirEpoch.getTimeInMillis();
Calendar result = Calendar.getInstance();
result.setTimeInMillis(timestamp + difference);

私はそれをテストしませんでした、しかしそれはあなたに考えを与えるはずです。また、タイムゾーンを考慮していなかったことにも注意してください。

于 2012-09-20T14:09:57.687 に答える
0

最も簡単な方法は、時間をミリ秒単位で設定した後にCalendarroll()のメソッドを使用することです。

calendar.roll(Calendar.YEAR, 37)--> 日付に 37 年を加算するだけです ;-)

しかし、私はあなたの入力データが間違っていると思います: 2007 年 1 月 1 日から現在までの経過秒数を取ると、例のように 400 億ではなく約 2 億になるはずです...

于 2012-09-20T14:17:13.597 に答える
0

これはあなたが望むことをする正しい方法です:

Calendar cal = Calendar.getInstance();
cal.set(2007, 1, 1, 0 ,0 ,0);
cal.set(Calendar.MILLISECOND, 0);
cal.add(Calendar.MILLISECOND, theirEpoch);

エポックが秒単位の場合、最後の MILISECOND を SECOND に変更します。

于 2012-09-20T14:20:28.470 に答える