2010-11-25 105 views
6

我對scala和jodatime都比較陌生,但對兩者都印象深刻。我試圖找出是否有更優雅的方式來做一些日期算術。這裏有一個方法:從scala中的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對象。將它們轉換爲Instants是我找到差異的最佳方式。有沒有更好的辦法?

另一方面的問題:當小時,分鐘或秒鐘是單個數字時,結果字符串不是零填充。有沒有一種簡單的方法使字符串看起來像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()` – 2014-05-25 16:17:50

1

是否this link幫助?

如何計算兩個日期之間的差異?

這個問題有不止一個答案!如果您只需要兩個日期之間的整個天數,那麼您可以使用Joda-Time 1.4版中的新Days類。

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

這個方法以及Days類中的其他靜態方法被設計爲可以很好地與JDK5靜態導入工具一起運行。

如果要計算兩個日期之間的天數,週數,月數和年數,則需要一個時間段默認情況下,這會將兩個日期時間之間的差值拆分爲多個部分,例如「1個月,2周,4天和7小時「。

Period p = new Period(startDate, endDate); 

您可以使用PeriodType控制哪些字段被提取。

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

此示例將不返回任何周或時間字段,因此前面的示例變爲「1個月和18天」。

+0

我一直在那裏,這是有幫助的。謝謝... – jxstanford 2010-11-26 06:40:08

7

你可能想看看豪爾赫·奧爾蒂斯爲Joda-Time製作的包裝,scala-time,因爲這些東西在Scala中可以使用得更好。

然後,您應該能夠使用像

(calcOpenTime to calcCloseTime).millis 
+0

謝謝喬恩,我會看看包裝。 – jxstanford 2010-11-26 06:38:32