Coldfusion 自定义函数的日期时间增强功能?

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

我目前正在修改一个现有函数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 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