0

我有一个 php 函数来做模糊时间(又名时间前)。

这在从服务器端构建表格时使用,但是现在我们正在通过 JavaScript 向表格中添加新项目,并且我们能够选择日期,因此我需要在 Javascript 中复制功能但让它接受日期格式YYYY-MM-DD2012-12-14.

我将开始研究它,但我对 Javascript 中的日期很糟糕,所以把它贴在这里,以防有人可以更快地做到这一点。

功能如下:

/**
 * Convert date into a 'fuzzy' format
 *   -  15 minutes ago,  3 days ago, etc.
 * Pass a unix timestamp or a string to parse to a date.
 * @param string|number
 * @return string
 */
function fuzzyTime($date_from, $invalid_date = 'a long time ago') {

    $_time_formats = array(
        array(60, 'just now'),
        array(90, '1 minute'),
        array(3600, 'minutes', 60),
        array(5400, '1 hour'),
        array(86400, 'hours', 3600),
        array(129600, '1 day'),
        array(604800, 'days', 86400),
        array(907200, '1 week'),
        array(2628000, 'weeks', 604800),
        array(3942000, '1 month'),
        array(31536000, 'months', 2628000),
        array(47304000, '1 year'),
        array(3153600000, 'years', 31536000),
    );

    $now = time(); // current unix timestamp

    // if a number is passed assume it is a unix time stamp
    // if string is passed try and parse it to unix time stamp
    if (is_numeric($date_from)) {
        $dateFrom = $date_from;
    } elseif (is_string($date_from)) {
        $dateFrom = strtotime($date_from);
    }

    $difference = $now - $dateFrom; // difference between now and the passed time.
    $val = ''; // value to return

    if ($dateFrom <= 0) {
        $val = $invalid_date;
    } else {
        //loop through each format measurement in array
        foreach ($_time_formats as $format) {
            // if the difference from now and passed time is less than first option in format measurment
            if ($difference < $format[0]) {
                //if the format array item has no calculation value
                if (count($format) == 2) {
                    $val = $format[1] . ($format[0] === 60 ? '' : ' ago');
                    break;
                } else {
                    // divide difference by format item value to get number of units
                    $val = ceil($difference / $format[2]) . ' ' . $format[1] . ' ago';
                    break;
                }
            }
        }
    }
    return $val;
}

这是我到目前为止所拥有的,但它在83 年前又回来了

var date = '2012-11-14';

console.log(fuzzyTime(date));

function fuzzyTime($date_from, $invalid_date) {

    if($invalid_date === undefined){
        $invalid_date = 'a long time ago';
    }

    var $_time_formats = [
        [60, 'just now'],
        [90, '1 minute'],
        [3600, 'minutes', 60],
        [5400, '1 hour'],
        [86400, 'hours', 3600],
        [129600, '1 day'],
        [604800, 'days', 86400],
        [907200, '1 week'],
        [2628000, 'weeks', 604800],
        [3942000, '1 month'],
        [31536000, 'months', 2628000],
        [47304000, '1 year'],
        [3153600000, 'years', 31536000]
    ];

    var $now = new Date(); // current unix timestamp
    var $dateFrom = new Date($date_from);

    var $difference = Math.abs(new Date() - $dateFrom);

    var $val = ''; // value to return

    if ($dateFrom <= 0) {
        $val = $invalid_date;
    } else {
        for (var i = 0; i < $_time_formats.length; i++) {
            var $format = $_time_formats[i];

            if ($difference < $format[0]) {
                //if the format array item has no calculation value
                if ($format.length == 2) {
                    $val = $format[1] + ($format[0] === 60 ? '' : ' ago');
                    break;
                } else {
                    // divide difference by format item value to get number of units
                    $val = Math.ceil($difference / $format[2]) + ' ' + $format[1] + ' ago';
                    break;
                }
            }
        }

    }
    return $val;
}
4

3 回答 3

1

moment.js库已经有一些东西可以帮助你做到这一点

http://momentjs.com/

于 2012-12-14T04:41:12.897 回答
0

周围有几个图书馆可以做到这一点。这是一个,

http://easydate.parshap.com/files/jquery.easydate-0.2.4.js

它很旧,但我会把它拆开并使用你需要的部件。

于 2012-12-14T04:37:01.623 回答
0

啊明白了

var date = '2012-12-14 17:52:00';

console.log(fuzzyTime(date));

function fuzzyTime(date_from, invalid_date) {

    if (invalid_date === undefined) {
        invalid_date = 'a long time ago';
    }

    var time_formats = [
        [60, 'just now'],
        [90, '1 minute'],
        [3600, 'minutes', 60],
        [5400, '1 hour'],
        [86400, 'hours', 3600],
        [129600, '1 day'],
        [604800, 'days', 86400],
        [907200, '1 week'],
        [2628000, 'weeks', 604800],
        [3942000, '1 month'],
        [31536000, 'months', 2628000],
        [47304000, '1 year'],
        [3153600000, 'years', 31536000]
    ];

    var now = new Date().getTime(); // current unix timestamp
    var dateFrom = new Date(date_from.replace('-','/')).getTime();

    var difference = Math.abs(now - dateFrom)/1000;

    var val = ''; // value to return

    if (dateFrom <= 0) {
        val = invalid_date;
    } else {
        for (var i = 0; i < time_formats.length; i++) {
            var format = time_formats[i];

            if (difference < format[0]) {
                //if the format array item has no calculation value
                if (format.length == 2) {
                    val = format[1] + (format[0] === 60 ? '' : ' ago');
                    break;
                } else {
                    // divide difference by format item value to get number of units
                    val = Math.ceil(difference / format[2]) + ' ' + format[1] + ' ago';
                    break;
                }
            }
        }

    }
    return val;
}
于 2012-12-14T04:54:32.480 回答