Как вывести дату / время как «20 минут назад» или «9 дней назад »и т. д.

Вместо изменения umask вы можете использовать параметр usergroups для pam_umask , с этот пользователь и группа имеют те же разрешения, что и классический способ unix для совместного использования папок.

# /etc/pam.d/login or
# /etc/pam.d/common-session or system-auth
session optional pam_umask.so usergroups
5
25.06.2018, 23:33
4 ответа

с помощью bash вы можете сделать что-то вроде кода ниже :
Обратите внимание, что вам нужно будет использовать sed или что-то еще, чтобы переформатировать строку даты во что-то, что date примет, например:

"2017-05-13 15:44:20"
#!/usr/bin/env bash

last_run="2017-05-13 15:44:20"


function relative() {
    local last_unix="$(date --date="$1" +%s)"    # convert date to unix timestamp
    local now_unix="$(date +'%s')"

    local delta=$(( $now_unix - $last_unix ))

    if (( $delta < 60 )) 
    then
        echo "last run "$delta" seconds ago"
        return 
    elif ((delta < 2700))  # 45 * 60
    then
        echo "last run "$(( $delta / 60 ))" minutes ago";
    fi
}

relative "$last_run"
3
27.01.2020, 20:35

Что ж, на языке Perl (из Perl Cookbook)ты бы пошел:

use Date::Calc qw(Delta_DHMS);
@now = ( 1981, 6, 16, 4, 35, 25 ); # 16 June 1981 4:35:25
@then =( 1973, 1, 18, 3, 45, 50 ); # 18 January 1973 3:45:50

@diff = Delta_DHMS( @then, @now );

print "This is now, then was $diff[0] days, $diff[1]:$diff[2]:$diff[3] ago!\n";

И получить:

This is now, then was 3071 days, 0:49:35 ago!

К сожалению, модуль Date::Calcне установлен по умолчанию, поэтому вам придется либо попросить кого-нибудь установить его, либо научиться использовать диспетчер модулей Perl CPAN самостоятельно.

0
27.01.2020, 20:35

Использованиеawk:

hdate () {
  awk -v date="$(date +%s -d "$1")" -v now="$(date +%s)" '
    BEGIN {  diff = now - date;
       if (diff > (24*60*60)) printf "%.0f days ago", diff/(24*60*60);
       else if (diff > (60*60)) printf "%.0f hours ago", diff/(60*60);
       else if (diff > 60) printf "%.0f minutes ago", diff/60;
       else printf "%s seconds ago", diff;
    }'
}

Пример:

~$ hdate '2018-06-17 14:22:20'
5 days ago

Дата ввода должна быть в формате, который dateможет прочитать.

1
27.01.2020, 20:35

Надеюсь, у кого-то есть лучшее решение, но вот сценарий, который придумал я:

#!/bin/sh
cd /tmp
git init -q
git -c user.email=0 -c user.name=0 commit -q -m 0 --allow-empty --date="$1"
git show --format=%ar

Результат:

$ relative.sh 2016-1-23
2 years, 5 months ago

$ relative.sh 2016-9-23
1 year, 9 months ago
2
27.01.2020, 20:35

Теги

Похожие вопросы