Может ли эта функция даты и времени быть написана более эффективно? - PullRequest
1 голос
/ 24 мая 2011

Следующая функция возвращает разницу между двумя значениями даты и времени в словах (в виде строки).Это может быть написано более эффективно / изящно?

/**
* @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 ]

3 голосов
/ 24 мая 2011

Это то, что я написал несколько месяцев назад на основе 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";
}
2 голосов
/ 24 мая 2011

Это выглядит хорошо для меня.Вместо этого вы можете использовать свой первый diff (local.secondDiff) для всех своих тестов, а не для повторного диффузии, но это, вероятно, легче читать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...