Вычислить разницу во времени между двумя датами

Подробное описание настройки приложений по умолчанию можно найти здесь в соответствующей вики-статье Arch.

Для вашего конкретного случая вы редактируете ~/.config/mimeapps.listи добавляете новую строку с inode/directory=nautilus.desktopв секцию [Default Applications].

Файл должен выглядеть следующим образом:

[Default Applications]
text/plain=SciTE.desktop 
text/x-tex=texmaker.desktop 
inode/directory=nautilus.desktop

6
09.09.2019, 19:57
2 ответа

Вы можете использовать date +%s, чтобы получить формат даты, который вы можете легко вычислить по (числу секунд [с оговорками] с 1 января 1970 года 00 :00 :00Z ). Вы также можете преобразовать дату формата ISO -назад (, возможно, неправильно, из-за таких проблем, как переход на летнее время ), используя date -d "$start" +%s. Это не идеально не только из-за проблем с летним временем при обратном преобразовании, но и если кто-то изменит время во время работы вашей программы или если что-то вроде ntp, то вы получите неправильный ответ. Возможно, очень неправильный.

Дополнительная секунда даст вам несколько неверный ответ (с отклонением на секунду ).

К сожалению, проверка исходного кода времени показала, что timeстрадает от тех же проблем с использованием настенных -часов (вместо "монотонного" времени ). К счастью, Perl доступен почти везде и может обращаться к монотонным таймерам :

.
start=$(perl -MTime::HiRes=clock_gettime,CLOCK_MONOTONIC -E 'say clock_gettime(CLOCK_MONOTONIC)')

Это будет количество секунд, прошедших с произвольной точки в прошлом (в Linux с момента загрузки, исключая время приостановки работы машины ). Он будет считать секунды, даже если часы переведены. Поскольку работать с действительными числами (не -целыми числами )в оболочке довольно сложно, вы можете сделать все это на Perl:

#!/usr/bin/perl
use warnings qw(all);
use strict;

use Time::HiRes qw(clock_gettime CLOCK_MONOTONIC);

my $cmd   = $ARGV[0];
my $start = clock_gettime(CLOCK_MONOTONIC);

system $cmd @ARGV; # this syntax avoids passing it to "sh -c"

my $exit_code = $?;
my $end       = clock_gettime(CLOCK_MONOTONIC);
printf STDERR "%f\n", $end - $start;

exit($exit_code ? 127 : 0);

Я назвал это "монотонным -временем"; и используется точно так же, как «время» (без каких-либо собственных аргументов ). Так:

$ monotonic-time sleep 5
5.001831                 # appeared ≈5s later
$ monotonic-time fortune -s
Good news is just life's way of keeping you off balance.
0.017800
12
27.01.2020, 20:20

В Bash вы также можете использовать волшебную переменнуюSECONDS:

SECONDS
Each time this parameter is referenced, the number of seconds since shell invocation is returned.

так:

bash -c 'a=$SECONDS; sleep 5; b=$SECONDS; printf "%d seconds passed\n" "$((b-a))"'

выводит 5 seconds passed.

Однако

SECONDSимеет только полную -вторую степень детализации, но date +"... %S"тоже. С датой GNU вы можете использовать %Nс %s, чтобы получить время в наносекундах.

a=$(date +%s%N)
sleep 1.234
b=$(date +%s%N)
diff=$((b-a))
printf "%s.%s seconds passed\n" "${diff:0: -9}" "${diff: -9:3}"

отпечатки:

1.237 seconds passed

Bash не может выполнять арифметические действия с числами с плавающей запятой, поэтому вам нужно либо использовать внешнюю утилиту для выполнения вычислений, либо выполнять вычисления в единицах меньше секунды, как я сделал выше. (Числа не помещаются в 32-битную систему, поэтому это может не работать в 32-битной -системе. Я не уверен, что Bash использует 64 бита для арифметики даже в 32 -битных системах.)

SECONDSтакже ведет себя неправильно, если системное время изменяется в течение периода измерения, но на самом деле вы должны установить время только один раз во время запуска, а затем позволить NTP отрегулировать часы, чтобы оставаться во времени.

11
27.01.2020, 20:20

Теги

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