Coldfusion 自定义函数的日期时间增强功能?
我目前正在修改一个现有函数by Ray,该函数用于检查已用时间和剩余时间: 以下是函数:Coldfusion 自定义函数的日期时间增强功能?,coldfusion,Coldfusion,我目前正在修改一个现有函数by Ray,该函数用于检查已用时间和剩余时间: 以下是函数: function ago(date){ var interval = ""; var offset = 0; var result = 0; if (isDate(arguments.date)){ var formattedDate = dateFormat(arguments.date, "dddd dd mmmm yyy
function ago(date){
var interval = "";
var offset = 0;
var result = 0;
if (isDate(arguments.date)){
var formattedDate = dateFormat(arguments.date, "dddd dd mmmm yyyy");
var k = datediff('d',arguments.date,now());
//writedump(k);
//abort;
if(k contains '-') {
if (dateDiff("s", now(), arguments.date) < 60){
// less than 1 minute show interval in seconds
offset = dateDiff("s", now(),arguments.date);
interval= offset == 1 ? "second":"seconds";
result = "#offset# #interval# left";
}else if (dateDiff("n",now(),arguments.date) < 60){
// less than 1 hour show interval in minutes
offset = dateDiff("n", now(),arguments.date);
interval= offset == 1 ? "minute":"minutes";
result = "#offset# #interval# left";
}else if (dateDiff("h",now(),arguments.date) < 24){
// less than 24 hours display interval in hours
offset = dateDiff("h", now(), arguments.date);
interval = offset == 1 ? "hour":"hours";
result = "#offset# #interval# left";
}else if (dateDiff("d",now(),arguments.date) < 2){
// less than 2 days display yesterday
result = "Tommarrow";
}else if (dateDiff("d", now(), arguments.date) < 7){
// less than 7 days display day
result = dayOfWeekAsString( dayOfWeek( arguments.date ));
}else if (dateDiff("w", now(), arguments.date)){
offset = dateDiff("w",now(), arguments.date);
interval = offset == 1 ? "week":"weeks";
result = "#offset# #interval# left";
}else if (dateDiff("m", now(), arguments.date)){
offset = dateDiff("m",now(), arguments.date);
interval = offset == 1 ? "month":"months";
result = "#offset# #interval# left";
}else if (dateDiff("yyyy", now(), arguments.date)){
offset = dateDiff("yyyy", now(), arguments.date);
interval = offset == 1 ? "year":"years";
result = "#offset# #interval# left";
}
else{
// otherwise display date
result = formattedDate;
}
}
else {
if (dateDiff("s", arguments.date, now()) < 60){
// less than 1 minute show interval in seconds
offset = dateDiff("s", arguments.date, now());
interval= offset == 1 ? "second":"seconds";
result = "#offset# #interval# ago";
}else if (dateDiff("n", arguments.date, now()) < 60){
// less than 1 hour show interval in minutes
offset = dateDiff("n", arguments.date, now());
interval= offset == 1 ? "minute":"minutes";
result = "#offset# #interval# ago";
}else if (dateDiff("h", arguments.date, now()) < 24){
// less than 24 hours display interval in hours
offset = dateDiff("h", arguments.date, now());
interval = offset == 1 ? "hour":"hours";
result = "#offset# #interval# ago";
}else if (dateDiff("d", arguments.date, now()) < 2){
// less than 2 days display yesterday
result = "yesterday";
}else if (dateDiff("d", arguments.date, now()) < 7){
// less than 7 days display day
result = dayOfWeekAsString( dayOfWeek( arguments.date ));
}else if (dateDiff("w", arguments.date, now())){
offset = dateDiff("w", arguments.date, now());
interval = offset == 1 ? "week":"weeks";
result = "#offset# #interval# ago";
}else if (dateDiff("m", arguments.date, now())){
offset = dateDiff("m", arguments.date, now());
interval = offset == 1 ? "month":"months";
result = "#offset# #interval# ago";
}else if (dateDiff("yyyy", arguments.date, now())){
offset = dateDiff("yyyy", arguments.date, now());
interval = offset == 1 ? "year":"years";
result = "#offset# #interval# ago";
}
else{
// otherwise display date
result = formattedDate;
}
}
interval = "<abbr title='" & formattedDate & "'>" & result & "</abbr>";
}
return interval;
}
函数日期(日期){
var区间=”;
var偏移=0;
var结果=0;
if(isDate(arguments.date)){
var formattedDate=dateFormat(arguments.date,“dddd-dd-mmmm-yyyy”);
var k=datediff('d',arguments.date,now());
//书面文件(k);
//流产;
如果(k包含“-”){
if(dateDiff(“s”,now(),arguments.date)<60){
//小于1分钟的显示间隔(秒)
offset=dateDiff(“s”,now(),arguments.date);
间隔=偏移量==1?“秒”:“秒”;
结果=“#偏移量##间隔#左”;
}else if(dateDiff(“n”,now(),arguments.date)<60){
//少于1小时的放映间隔(分钟)
offset=dateDiff(“n”,now(),arguments.date);
间隔=偏移量==1?“分钟”:“分钟”;
结果=“#偏移量##间隔#左”;
}else if(dateDiff(“h”,now(),arguments.date)<24){
//小于24小时的显示间隔(小时)
offset=dateDiff(“h”,now(),arguments.date);
间隔=偏移==1?“小时”:“小时”;
结果=“#偏移量##间隔#左”;
}else if(dateDiff(“d”,now(),arguments.date)<2){
//昨天不到两天的时间
结果=“骨髓”;
}else if(dateDiff(“d”,now(),arguments.date)<7){
//显示日少于7天
结果=dayOfWeekAsString(dayOfWeek(arguments.date));
}else if(dateDiff(“w”,now(),arguments.date)){
offset=dateDiff(“w”,now(),arguments.date);
间隔=偏移==1?“周”:“周”;
结果=“#偏移量##间隔#左”;
}else if(dateDiff(“m”,now(),arguments.date)){
offset=dateDiff(“m”,now(),arguments.date);
间隔=偏移==1?“月”:“月”;
结果=“#偏移量##间隔#左”;
}else if(dateDiff(“yyyy”,now(),arguments.date)){
offset=dateDiff(“yyyy”,now(),arguments.date);
间隔=偏移==1?“年”:“年”;
结果=“#偏移量##间隔#左”;
}
否则{
//否则显示日期
结果=格式化日期;
}
}
否则{
if(dateDiff(“s”,arguments.date,now())<60){
//小于1分钟的显示间隔(秒)
offset=dateDiff(“s”,arguments.date,now());
间隔=偏移量==1?“秒”:“秒”;
结果=“#偏移量##间隔#前”;
}else if(dateDiff(“n”,arguments.date,now())<60){
//少于1小时的放映间隔(分钟)
offset=dateDiff(“n”,arguments.date,now());
间隔=偏移量==1?“分钟”:“分钟”;
结果=“#偏移量##间隔#前”;
}else if(dateDiff(“h”,arguments.date,now())<24){
//小于24小时的显示间隔(小时)
offset=dateDiff(“h”,arguments.date,now());
间隔=偏移==1?“小时”:“小时”;
结果=“#偏移量##间隔#前”;
}else if(dateDiff(“d”,arguments.date,now())<2){
//昨天不到两天的时间
结果=“昨天”;
}else if(dateDiff(“d”,arguments.date,now())<7){
//显示日少于7天
结果=dayOfWeekAsString(dayOfWeek(arguments.date));
}else if(dateDiff(“w”,arguments.date,now()){
offset=dateDiff(“w”,arguments.date,now());
间隔=偏移==1?“周”:“周”;
结果=“#偏移量##间隔#前”;
}else if(dateDiff(“m”,arguments.date,now()){
offset=dateDiff(“m”,arguments.date,now());
间隔=偏移==1?“月”:“月”;
结果=“#偏移量##间隔#前”;
}else if(dateDiff(“yyyy”,arguments.date,now()){
offset=dateDiff(“yyyy”,arguments.date,now());
间隔=偏移==1?“年”:“年”;
结果=“#偏移量##间隔#前”;
}
否则{
//否则显示日期
结果=格式化日期;
}
}
间隔=“”&结果&“”;
}
返回间隔;
}
结果是“还剩1周”或“2周前”。但与其说是“2周”,不如说是“1周4天”,或者说是剩余的天数,除非是“2周”。哇,这是很多if语句,最好是找一个计算过的方法,如下所示:
<cfset date1 = CreateDate(2014,07,07)>
<cfset date2 = CreateDate(2014,07,19)>
<cfset dateDifference = dateDiff("d",date1,date2)>
<cfset weeks = int(dateDifference/7)>
<cfset days = dateDifference MOD 7>
<cfoutput>
#weeks# weeks and #days# days ago
</cfoutput>
<cfscript>
public string function timeDifferenceFormattedString(
required date dateStart,
date dateEnd = Now()
) {
// Is datestart actually after dateend?
switch (DateCompare(arguments.dateStart,arguments.dateEnd)) {
case 1:
var suffix = 'since';
var currentLowerDate = arguments.dateEnd;
var currentUpperDate = arguments.dateStart;
break;
case 0:
return 'The dates are the same';
break;
case -1:
var suffix = 'until';
var currentLowerDate = arguments.dateStart;
var currentUpperDate = arguments.dateEnd;
break;
}
var arrDateParts = [ 'yyyy' , 'm' , 'ww' , 'd', 'h', 'n', 's' ];
var arrDatePartsHuman = [ 'year' , 'month' , 'week' , 'day', 'hour', 'minute', 'second' ];
var arrDateDiffs = [];
for ( var i = 1; i<=ArrayLen(arrDateParts);i++ ) {
var thisDiff = Int(DateDiff( arrDateParts[i] , currentLowerDate, currentUpperDate ));
if (
thisDiff > 0
) {
arrDateDiffs.add( thisDiff & ' ' & arrDatePartsHuman[i] & ( thisDiff > 1 ? 's' : '' ) );
currentLowerDate = DateAdd( arrDateParts[i] , thisDiff, currentLowerDate );
}
}
arrDateDiffs.add(suffix);
return ArrayToList(arrDateDiffs,' ');
}
</cfscript>
<cfoutput>
<p>#timeDifferenceFormattedString(CreateDateTime(2013, 7, 10, 0, 0, 0), now())#</p>
<p>#timeDifferenceFormattedString(CreateDateTime(2013, 7, 10, 0, 0, 0), CreateDateTime(2013, 7, 10, 0, 0, 0))#</p>
<p>#timeDifferenceFormattedString(now(),CreateDateTime(2013, 7, 10, 0, 0, 0))#</p>
</cfoutput>
#几周前
然后,如果您需要以另一种方式进行操作,例如,几周或几天,您也可以这样做,只需更改输出文本即可。您所需要做的就是确保date1总是早于date2(在时间上)
更新
再次查看后,根据您在何处查找的内容,我找到了Steve Withington的这篇博文:
然后,我把他的代码转换成一个函数,我认为它应该做你想做的,或者非常接近它:
<cfscript>
function timeUntil(dateStart, dateEnd) {
var compareGivenDates = DateCompare(arguments.dateStart, arguments.dateEnd, "s");
var rightNow = DateFormat(now(), "mm/dd/yyyy") & " " & TimeFormat(now(), "hh:mm:ss tt");
var compareNow = DateCompare(rightNow, arguments.dateStart, "s");
switch (compareNow) {
case -1:
throw(message="End date must be after start date", detail="The end date must be after the start date otherwise the calculations will not be possible.");
case 1:
var arguments.dateStart = rightNow;
}
var returnTimeRemaining="";
var dateStart = DateFormat(arguments.dateStart, "mm/dd/yyyy") & " " & TimeFormat(arguments.dateStart, "hh:mm:ss tt");
var dateEnd = DateFormat(arguments.dateEnd, "mm/dd/yyyy") & " " & TimeFormat(arguments.dateEnd, "hh:mm:ss tt");
var hdif = Abs(DateDiff("h", dateEnd, dateStart));
var ndif = Abs(DateDiff("n", dateEnd, dateStart));
var sdif = Abs(DateDiff("s", dateEnd, dateStart));
var years2go = Abs(DateDiff("yyyy", dateEnd, dateStart));
var months2go = Abs(DateDiff("m", dateEnd, dateStart));
var weeks2go = Abs(DateDiff("ww", dateEnd, dateStart));
var days2go = Abs(DateDiff("d", dateEnd, dateStart));
if (DatePart('h', now()) LT 12 OR days2go EQ 1) {
var h = 'h';
} else {
var h = 'H';
}
var hours2go = TimeFormat(dateEnd-dateStart, h);
var min2go = TimeFormat("#dateEnd-dateStart#", "m");
var sec2go = TimeFormat("#dateEnd-dateStart#", "s");
var newmonths = months2go-(years2go*12);
var tempDate = dateadd("m", months2go, arguments.dateStart);
var newweeks = Abs(DateDiff("ww", arguments.dateEnd, tempDate));
var tempdays = Abs(DateDiff("d", arguments.dateEnd, tempDate));
var newdays = tempdays-(newweeks*7);
var comparison = DateCompare(dateStart, dateEnd, "s");
switch (comparison) {
case -1:
if (years2go GTE 1) {
returnTimeRemaining = returnTimeRemaining & "#years2go#y ";
}
if (newmonths GTE 1) {
returnTimeRemaining = returnTimeRemaining & "#newmonths#m ";
}
if (newweeks GTE 1) {
returnTimeRemaining = returnTimeRemaining & "#newweeks#w ";
}
if (newdays GTE 1) {
returnTimeRemaining = returnTimeRemaining & "#newdays#d ";
}
if (ndif GTE 60) {
returnTimeRemaining = returnTimeRemaining & "#hours2go#h ";
}
if (sdif GTE 60) {
returnTimeRemaining = returnTimeRemaining & "#min2go#m ";
}
if (sdif GTE 1) {
returnTimeRemaining = returnTimeRemaining & "#sec2go#s";
} else {
returnTimeRemaining = "0s";
}
break;
case 0:
returnTimeRemaining = false;
break;
case 1:
returnTimeRemaining = false;
break;
}
return returnTimeRemaining
}
</cfscript>
<cfoutput>
#timeUntil(CreateDateTime(2013, 7, 19, 0, 0, 0), now())#
</cfoutput>
函数timeUntil(dateStart,dateEnd){
var compareGivenDates=DateCompare(arguments.dateStart,arguments.dateEnd,“s”);
var rightNow=DateFormat(now(),“mm/dd/yyyy”)&“&TimeFormat(now(),“hh:mm:ss tt”);
var compareNow=Dat