Преобразование времени PHP Fuzzy в Javascript?

У меня есть функция php для нечеткого времени (также известного как время назад).

Это используется при построении таблицы со стороны сервера, однако теперь мы добавляем новые элементы в таблицу через JavaScript, и у нас есть возможность выбрать дату, поэтому мне нужно продублировать функциональность в Javascript, но принять дату в формате YYYY-MM-DD например 2012-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;
}

person Hailwood    schedule 14.12.2012    source источник


Ответы (3)


В библиотеке moment.js уже есть что-то, что поможет вам в этом.

См. http://momentjs.com/.

person Tanzeel Kazi    schedule 14.12.2012

Для этого есть несколько библиотек. вот один,

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

Он довольно старый, но я бы разобрал его и использовал нужные детали.

person shapeshifter    schedule 14.12.2012

Ах понял,

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;
}
person Hailwood    schedule 14.12.2012