두 날짜 사이의 시차 계산

두 날짜 사이의 시차 계산

스크립트가 시작되고 중지되는 시기를 알기 위해 크론 작업의 실행 시간을 추적하는 어리석은 스크립트가 있습니다.

start=$(date +'%Y-%m-%d %H:%M:%S') # This line converts to 2019-09-10 00:50:48
echo "$start"

./actual_script_runs_here

stop=$(date +'%Y-%m-%d %H:%M:%S')
echo "$stop"

이 방법은 효과적입니다. 하지만 스크립트를 실행하는데 걸리는 시간은 제가 직접 계산해야 합니다. bash에서 계산할 수 있습니까?

아니면 명령을 사용할 수도 있습니다 time. 그러나 3번의 다른 결과를 반환하고 3개의 새로운 줄을 포함합니다. 내 스크립트 결과와 함께 시간 결과가 한 줄에 표시되는 것을 보고 싶습니다.

답변1

이를 사용하여 date +%s수학적으로 쉽게 계산할 수 있는 날짜 형식(1970년 1월 1일 00:00:00Z 이후의 초 수 [주의사항])을 얻을 수 있습니다. 를 사용할 수도 있습니다 date -d "$start" +%s. 다시 변환할 때 일광 절약 시간제 문제가 있을 뿐만 아니라 프로그램이 실행되는 동안 누군가가 시간을 변경하거나 ntp와 같은 경우 잘못된 대답을 얻게 되므로 이상적이지 않습니다. 아마도 매우 잘못된 것 같습니다.

윤초는 약간 잘못된 답변을 제공합니다(1초씩).

안타깝게도 확인해보니시간 소스 코드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

답변2

Bash에서는 매직 변수를 사용할 수도 있습니다 SECONDS.

SECONDS
이 매개변수가 참조될 때마다 쉘이 호출된 이후의 시간(초)이 반환됩니다.

그래서:

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

출력 5 seconds passed.

SECONDS전체 초 세분성만 있지만 date +"... %S"GNU 날짜의 경우 %Nwith를 사용하여 %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는 부동 소수점 숫자로 연산을 수행할 수 없으므로 외부 유틸리티를 사용하여 계산을 수행하거나 위에서 했던 것처럼 1초 미만의 단위로 수행해야 합니다. (이 숫자는 32비트에 맞지 않으므로 32비트 시스템에서는 작동하지 않을 수 있습니다. 32비트 시스템에서도 Bash가 산술에 64비트를 사용하는지 잘 모르겠습니다.)

SECONDS측정 중에 시스템 시간이 수정되는 경우에도 오류가 발생할 수 있지만 실제로는 시작 중에 시간을 한 번만 설정한 다음 NTP가 시간을 유지하도록 시계를 조정하도록 해야 합니다.

답변3

아무도 Python 사용에 대해 아무 말도 하지 않았다는 사실에 놀랐습니다! 예를 들어 5일 전은 yyyymmdd입니다.

MYDATE=$( python -c 'from datetime import date, timedelta; 
    print( ( date.today() - timedelta(days=5) ).strftime("%Y%m%d"))' )

일보다 작은 단위로 작업하려면 가져오고 datetime가능하면 사용하십시오.datetime.now()

관련 정보