Datetime 可以更有效地编写此日期时间函数吗?
以下函数以文字(字符串形式)返回两个日期时间值之间的差值。它能写得更高效/优雅吗Datetime 可以更有效地编写此日期时间函数吗?,datetime,coldfusion,Datetime,Coldfusion,以下函数以文字(字符串形式)返回两个日期时间值之间的差值。它能写得更高效/优雅吗 /** * @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.fromTi
/**
* @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")#";
}
/**
*@hint返回两个时间字符串之间的差值(以单词表示)。
*/
公共字符串函数timeAgoInWords(所需日期fromTime,日期toTime=now())
{
local.secondDiff=dateDiff(“s”,arguments.fromTime,arguments.toTime);
如果(local.secondDiff我觉得不错。您可以在所有测试中使用第一个diff(local.secondDiff),而不是重新进行diff,但这可能更容易阅读。我觉得不错。您可以使用第一个diff(local.secondDiff)这是我几个月前写的,基于上面评论中发布的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";
}
string函数之前(必需的日期)
{
var dateparts=[“yyyy”、“m”、“d”、“h”、“n”];
var datepartNames=[“年”、“月”、“日”、“小时”、“分钟”];
var rightNow=Now();
对于(变量i=1;i 1)
返回“#diff##datepartNames[i]#s ago”;
如果(差异==1)
返回“#diff##datepartNames[i]#ago”;
}
返回“刚才”;
}
这是我几个月前写的,基于上面评论中发布的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";
}
string函数之前(必需的日期)
{
var dateparts=[“yyyy”、“m”、“d”、“h”、“n”];
var datepartNames=[“年”、“月”、“日”、“小时”、“分钟”];
var rightNow=Now();
对于(变量i=1;i 1)
返回“#diff##datepartNames[i]#s ago”;
如果(差异==1)
返回“#diff##datepartNames[i]#ago”;
}
返回“刚才”;
}
我不知道它是否更有效,但有人已经编写了一个UDF,它可以做到这一点:@Al,谢谢……使用循环看起来很奇怪……按照我所写的内容写一些东西难道不是更有意义吗?循环中的值是什么?哦,顺便说一句,默认情况下,你根本不需要@hint。@Henry,谢谢。我更喜欢我写的东西t、 它对函数有任何影响吗?不管你是否使用@hint都没有影响…只是输入更少,更干净,尤其是当你在块中只有一个提示的时候。我不知道它是否更有效,但有人已经写了一个UDF来做这件事:@Al,谢谢…使用循环看起来很奇怪…它不是更有用吗我想按照我写的内容写点什么?循环中的值是什么?哦,顺便说一句,默认情况下你根本不需要@hint。@亨利,谢谢。我更喜欢它。它对函数有任何影响吗?不管你是否使用@hint都没有影响…只是少输入和更干净,尤其是当你在块中只有一个提示时。谢谢,我好极了。该函数每页将被调用大约50次,因此不使用数组可能是一种更好的方法?不过,这种方法更简洁、易读。谢谢您的示例。@Mohamad,如果您愿意,您可以将该UDF放入CFC,并将两个数组缓存在变量范围内。然后将单例CFC放入应用程序范围内。谢谢,这看起来不错。该函数每页大约调用50次,因此,如果不使用数组,这可能是一种更好的方法。不过,这种方法更简洁、易读。谢谢您的示例。@Mohamad,如果您愿意,您可以将该UDF放入CFC,并将两个数组缓存在变量范围内。然后将单例CFC放入您的应用程序中适用范围。