2011-05-24 93 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)来进行所有测试,而不是重新区分,但这可能更易于阅读。

相关问题