2010-11-25 6 views
6

私はスカラーとジョーダタイムの両方に比較的新しいですが、両方にかなり感銘を受けました。私はいくつかの日付の算術演算を行うよりエレガントな方法があるかどうかを調べようとしています。スカラのDateTimeからDateTimeを引いた


private def calcDuration() : String = { 
    val p = new Period(calcCloseTime.toInstant.getMillis - calcOpenTime.toInstant.getMillis) 
    val s : String = p.getHours.toString + ":" + p.getMinutes.toString + 
     ":" + p.getSeconds.toString 
    return s 
} 

私はMongoDBの中にそれを入れていますので、私は文字列にすべてを変換し、私はジョダ期間や期間をシリアル化するかどうかはわかりません:ここに方法があります。誰かが私が本当に答えに感謝することを知っていれば。

とにかく、calcCloseTimeメソッドとcalcOpenTimeメソッドは、DateTimeオブジェクトを返します。それらをインスタントに変換することが、私が違いを得るために見つけた最良の方法です。より良い方法がありますか?

もう1つの質問:時、分または秒が1桁の場合、結果の文字列はゼロで埋められません。その文字列をHH:MM:SSのように見えるようにする簡単な方法はありますか?

おかげで、 ジョン

答えて

8

PeriodフォーマットがPeriodFormatterクラスによって行われているようなものを使用することができるはずです。デフォルトのものを使用するか、PeriodFormatterBuilderを使用して独自のものを構築することができます。あなたはおそらくも日遷移は考慮されないことに注意する必要があります


scala> import org.joda.time._ 
import org.joda.time._ 

scala> import org.joda.time.format._ 
import org.joda.time.format._ 

scala> val d1 = new DateTime(2010,1,1,10,5,1,0) 
d1: org.joda.time.DateTime = 2010-01-01T10:05:01.000+01:00 

scala> val d2 = new DateTime(2010,1,1,13,7,2,0) 
d2: org.joda.time.DateTime = 2010-01-01T13:07:02.000+01:00 

scala> val p = new Period(d1, d2) 
p: org.joda.time.Period = PT3H2M1S 

scala> val hms = new PeriodFormatterBuilder() minimumPrintedDigits(2) printZeroAlways() appendHours() appendSeparator(":") appendMinutes() appendSuffix(":") appendSeconds() toFormatter 
hms: org.joda.time.format.PeriodFormatter = [email protected] 

scala> hms print p 
res0: java.lang.String = 03:02:01 

あなたが適切にこのビルダーを設定したいかもしれませんように、それはいくつかのより多くのコードを取ることはできますが、そのように例のためにそれを使用することができます

scala> val p2 = new Period(new LocalDate(2010,1,1), new LocalDate(2010,1,2)) 
p2: org.joda.time.Period = P1D 

scala> hms print p2               
res1: java.lang.String = 00:00:00 

これらも同様に必要な場合は、必要なフィールド(日、週、年)をフォーマッタに追加する必要があります。

+0

素晴らしいですが、toFormatterの最後に括弧が必要です: '... appendSeconds()toFormatter()' –

1

this link助けをしていますか?

どのように2つの日付の違いを計算しますか?

この質問には複数の回答があります。 2つの日付の間の日数がほしい場合は、Joda-Timeのバージョン1.4で新しいDaysクラスを使用できます。

Days d = Days.daysBetween(startDate, endDate); 
int days = d.getDays(); 

このメソッドおよびDaysクラスのその他の静的メソッドは、JDK5静的インポート機能でうまく動作するように設計されています。

ただし、2つの日付間の日数、週数、月数、年数を計算する場合は、期間が必要です。デフォルトでは、2つの日付時刻の差を「1か月、2週間、4日間および7時間」。

PeriodTypeを使用して抽出するフィールドを制御できます。

Period p = new Period(startDate, endDate, PeriodType.yearMonthDay()); 

この例では、週または時間フィールドは返されず、前の例は「1月18日」になります。

+0

私はそこにいましたし、助けになりました。ありがとう... – jxstanford

7

Jorge-Timeのラッパー、scala-timeを参照して、Scalaで作業するのが少し面白いかもしれません。

その後、

(calcOpenTime to calcCloseTime).millis 
+0

ありがとうジョン、私はラッパーを調べます。 – jxstanford

関連する問題