2015-05-19 31 views
0

我試圖計算自特定時間段開始日期以來各種日期的時間。由於計算日期很簡單,但我也希望函數返回-1,如果它們之間的日期是負數。我不確定一個乾淨的方法來做到這一點? 我有:Scala:基於int表達式的值返回

def getTimeBetween(date1: String, date2: String, format: String, dtype: String): Int = { 
    dtype match { 
    case "fixed" => { 
     if (date1 == null) throw new Exception("Specify date1") 
     else Days.daysBetween(date2, date1).getDays() 
    } 
    case _ => throw new Exception("Enter a valid type") 
    } 
} 

我是很新,斯卡拉,所以我不知道所有的語法很好呢。我更習慣於Java/C++,所以我認爲接下來如果/ else語句可以工作,但我意識到這不是要走的路。

謝謝。

+0

首先,'type'是Scala一個關鍵字,所以你不能把它作爲一個變量。其次,你可以使用像'joda.time'這樣的庫嗎?還是僅限於原始類型? –

+0

這不完全是我命名的一切。我正在做這個實習生,並不想把我的實際代碼放好。我正在使用joda.time庫 – fiveandten

+0

date1和date2實際上是字符串,還是你將它們作爲'DateTime'類型? –

回答

1

一個明顯的改進是不拋出運行時異常,而是依賴於標準的Scala構造,這裏想到了Try

import scala.util.{ Success, Failure, Try } 

import org.joda.time.Days 

def getTimeBetween(date1: String, date2: String, format: String, dtype: String): Try[Int] = { 
    dtype match { 
    case "fixed" => { 
     Try(Days.daysBetween(date2, date1).getDays) match { 
     case Success(days) if days >= 0 => Success(days) 
     case Success(_) => Success(-1) 
     case Failure(t) => Failure(t) 
     } 
    } 
    case _ => Failure(new IllegalArgumentException) 
    } 
} 

此方法將返回Success(#days),如果他們是積極的,或Success(-1)如果他們之間負的天數。

Try包裝圍繞daysBetween功能將捕獲到可能在分析過程中被拋出,如非法格式或參數null值的任何異常。任何運行時異常都會導致Failure(t)t被捕獲異常。

還有很多其他方法可以解決這個問題,比如Either類型,或者使用Optionscala.util.catching函數。

編輯

自從你離開它從你的例子我也做過,但對於daysBetween方法編譯你需要解析字符串轉換爲datetime對象,使用類似DateTime.parse(date1)

+0

鑑於date1和date2是字符串,是不是一些必要的顯式轉換? –

+0

是的你是正確的我更新了我的例子 –

+0

這正是我正在尋找的。我在嘗試各種各樣的事情,但找不到Try/Success/Failure之類的東西。我唯一的問題是,當返回值時,我可以像'如果days> = 0 => days'或確實返回'Success(days)'有任何額外的值嗎? – fiveandten

0

假設你的方法返回一個負整數,你想它返回-1,而不是所有負值你可以簡單地把它放在一個輔助的變量和校驗

val res = Days.daysBetween(date2, date1).getDays() 
if (res <0) -1 else res 

一個更緊湊(和argueably不太清楚方法)僅用於詮釋將使用最大

Days.daysBetween(date2, date1).getDays().max(-1)