2011-05-24 97 views
1

以下函數以字符串形式返回兩個日期時間值之間的差異(以字符串形式)。它可以寫得更有效率/優雅嗎?這個日期時間函數可以寫得更有效嗎?

/** 
* @hint Returns the difference between two time strings in words. 
*/ 
public string function timeAgoInWords(required date fromTime, date toTime=now()) 
{ 
    local.secondDiff = dateDiff("s", arguments.fromTime, arguments.toTime); 

    if (local.secondDiff <= 60) 
     return "#local.secondDiff# seconds ago"; 

    local.minuteDiff = dateDiff("n", arguments.fromTime, arguments.toTime); 

    if (local.minuteDiff <= 60) 
     if (local.minuteDiff < 2) 
      return "1 minute ago"; 
     else return "#local.minuteDiff# minutes ago"; 

    if (local.minuteDiff <= 1440) 
     if (local.minuteDiff <= 120) 
      return "1 hour ago"; 
     else return "#int(local.minuteDiff/60)# hours ago"; 

    if (local.minuteDiff <= 2880) 
     return "yesterday"; 

    if (local.minuteDiff <= 4320) 
     return "2 days ago"; 

    local.monthDiff = dateDiff("m", arguments.fromTime, arguments.toTime); 

    if (local.monthDiff <= 12) 
     return "#dateFormat(arguments.fromTime, "mmm dd")# at #timeFormat(arguments.fromTime, "h:mm")#"; 

    return "#dateFormat(arguments.fromTime, "mmm dd 'yy")# at #timeFormat(arguments.fromTime, "h:mm")#"; 
} 
+2

我不知道,如果它的效率更高,但是已經有人寫了一個UDF,這是否非常的事:http://cflib.org/udf/ago – ale 2011-05-24 16:44:27

+0

@Al,謝謝......它看起來但是用一個循環來怪異......按照我寫的內容寫一些東西不是更有意義嗎?循環中的價值是什麼? – Mohamad 2011-05-24 16:57:56

+0

哦順便說一句,默認情況下你根本不需要@hint。 – Henry 2011-05-24 21:22:40

回答

3

這是我幾個月前寫的,基於UDF Al Everett上面發表的評論和CF9腳本風格編寫的。它不會更有效率。實際上,它的執行速度應該比較慢,因爲它有多個對dateDiff()的調用,並且需要預先設置2個陣列,但總體線數更短且易於理解。

string function ago(required Date dateThen) 
{ 
    var dateparts = ["yyyy","m","d","h","n"]; 
    var datepartNames = ["year","month","day","hour","minute"]; 
    var rightNow = Now(); 

    for (var i = 1; i <= 5; i++) // 5 == arrayLen(dateparts) 
    { 
     var diff = dateDiff(variables.dateparts[i], dateThen, rightNow); 

     if (diff > 1) 
      return "#diff# #datepartNames[i]#s ago"; 

     if (diff == 1) 
      return "#diff# #datepartNames[i]# ago"; 
    } 

    return "Just Now"; 
} 
+0

謝謝,看起來不錯。這個函數每頁大概會調用50次,所以也許這是一個更好的方法去做沒有數組的方法?雖然更清潔,可讀性更強。感謝這個例子。 – Mohamad 2011-05-24 17:58:37

+2

@Mohamad,如果您願意,可以將該UDF放入CFC中,並將2個數組緩存在Variables範圍中。然後將Singleton CFC放入您的應用程序範圍中。 – Henry 2011-05-24 18:23:17

+1

+1。我發現數組方法更優雅/可讀。 – Leigh 2011-05-25 18:11:38

2

這對我來說很好。您可以改爲使用您的第一個diff(local.secondDiff)來進行所有測試,而不是重新區分,但這可能更易於閱讀。

相關問題