2016-09-14 5 views
0

2分間の経過時間を表すOrigin-Destination行列があります。私は、経過時間を日付に追加する最も良い方法は何か疑問に思います。JavaでDateに分を表すDouble変数を追加します。

 Date clock; 
     SimpleDateFormat reqDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
     clock = reqDF.parse(line[25]); 
     Double distance = distDB.find_distance(O, D, mode, facility_id); 
     Date current_time = clock + distance; 

Dateの代わりにCalendar型を使用すると、さらに簡単になりますか?

おかげ

+0

は、なぜあなたは正確にあなたが望むものを表して独自のクラスを作成しないでください。 –

+0

わかりません。 – Chopin

+0

多分私は分かりません。日付は 'time'のためのものです - 距離は時間と何が関係していますか?日付と距離を保存する場合は、DateフィールドとDoubleフィールドを持つクラスを作成します。 –

答えて

1

TLを、DR

Instant.parse("2016-12-23T01:23:45Z") 
     .plusNanos(Math.round( 
      yourNumberOfMinutesAsDouble * 
      TimeUnit.MINUTES.toNanos(1)) 
     ) 

は古い日時のクラスを避けてください。

実際には、java.util.Datejava.util.Calendarも使用しないでください。これらの古いレガシークラスは、非常に面倒で、混乱し、欠陥があることで知られています。 java.timeクラスに置き換えられました。

古いクラスの場合、Answer by Jireugiは正しいです。 java.timeクラスについては、を参照してください。経過時間を表すためにdoubleDoubleを使用して良いアイデア経過時間

を小数を使用していない

は避けてください。第1に、そのタイプは、実行速度の精度を犠牲にするfloating-point技術を使用する。したがって、小数点以下の桁数に余分な余分な数字が付くことがよくあります。

第2に、これは、60秒から60分、60分から1時間というように、時間を処理するのは難しい方法です。

  • Javaでは、PeriodまたはDurationクラスを使用します。 Oracle Tutorialを参照してください。
  • ISO 8601形式PnYnMnDTnHnMnSを使用してください。ここでは、Pが先頭を示し、Tは、years-months-daysとhours-minutes-secondsを区切ります。したがって、2分30秒はPT2M30Sとなります。

ナノ秒

を私たちは、経過時間を分単位としてDoubleで作業しなければならない場合は、のは、全体の数(整数)にあなたの端数進数から変換してみましょう。

古いレガシーの日時クラスは、ミリ秒の分解能に制限されていますが、java.timeクラスは、ナノ秒ほど細かくなることがあります。したがって、Doubleをナノ秒の整数に変換したいと考えています。

この計算では、分単位でナノ秒数のマジックナンバーをハードコードするのではなく、TimeUnit列挙型を使用してみましょう。そのクラスは、私たちのために1分でナノ秒の数を計算することができます(60 * 1_000_000_000L)。

最後に、Math.round関数は、負の無限大に四捨五入して、引数に最も近いlongを返します。

long nanoseconds = Math.round( 
    yourNumberOfMinutesAsDouble * 
    TimeUnit.MINUTES.toNanos(1) 
); 

Instant

UTCに日時の値を扱う場合

は、 Instantクラスを使用します。各 Instantはタイムライン上の瞬間を UTCに表し、解像度は nanosecondsです。むしろあなたの経過時間として Double周りを渡すよりも

Instant Instant.parse("2016-12-23T01:23:45Z") 
Instant future = Instant.plusNanos(nanoseconds); 

Duration

、私は強くあなたの周りDurationオブジェクトを渡す示唆しています。

Duration duration = Duration.ofNanos(Math.round(yourNumberOfMinutesAsDouble * TimeUnit.MINUTES.toNanos(1))); 

あなたは、このようなplusminusなどDurationで数学を行うことができます。

Instant instant = Instant.parse("2016-12-23T01:23:45Z") 
Instant future = instant.plus(duration); 

あなたは単にtoStringを呼び出すことによって、このようなPT8H6M12.345Sなどの標準的なISO 8601形式でDurationの文字列表現を生成することができます。そして、Durationはそのような文字列も同様に解析できます。

String output = duration.toString(); // PT8H6M12.345S 

...または他の方向に行く...

Duration duration = Duration.parse("PT8H6M12.345S"); 
+0

ありがとうございました。 – Chopin

+0

親指アップ!新しくより優れたタイムクラスを使用して、新しいJava世界に生きることができます。 – Jireugi

0

私はあなたの状況を理解している場合、あなたは(時間である - 分)行列[I、J]の値を使用して、現在の日付を取得したいあなたはの指示を与えるために時間を更新したいです - あなたがOrigin(i)から出発したら、あなたがDestination(j)に到達するまでの時間。 私はむしろJavaのCalendarクラスを使用したいと思います。より柔軟に対応できます。 'Calendar'クラスを使用すると、 'Date'タイプのインスタンスを返すgetTime()と、このクラスを使用してタイムオフセットを追加/削除することができます(このような操作のためにこのクラスが提供するメソッドがあります)。カレンダーへ

3

あなたはMath.roundを使用して、これを試みることができる:ここで

Date clock; 
SimpleDateFormat reqDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
clock = reqDF.parse(line[25]); 
Double distance = distDB.find_distance(O, D, mode, facility_id); 

long clockTimeMs = clock.getTime(); 
long distTimeInMs = Math.round(distance * 60000); 
Date current_time = new Date(clockTimeMs + distTimeInMs); 

日はミリ秒単位のタイムスタンプに変換されます。 距離は分単位であるため、開始時間( "clock")に追加するには、60 * 1000(= 60000)を乗算してミリ秒単位で変換する必要があります。最後に、開始時刻からの距離を表す新しいDateが作成されます。

ここでDateクラスの詳細をご覧ください:https://docs.oracle.com/javase/6/docs/api/java/util/Date.html

関連する問題