날짜 차이를 빠르게 계산

날짜 차이를 빠르게 계산

나는 종종 다음과 같은 몇 가지 빠른 날짜 계산을 수행하고 싶습니다.

  • 이 두 날짜의 차이점은 무엇입니까?
  • 오늘 날짜는 언제인가요?N다른 데이트 이후 몇 주가 지났나요?

저는 보통 달력을 열고 날짜를 세는데, 이런 유형의 계산을 수행하는 데 사용할 수 있는 프로그램/스크립트가 있어야 한다고 생각했습니다. 어떤 제안이 있으십니까?

답변1

"날짜로부터 n주"는 GNU 날짜(1)를 사용하여 쉽게 계산할 수 있습니다.

$ date -d 'now + 3 weeks'
Tue Dec  6 23:58:04 EST 2011
$ date -d 'Aug 4 + 3 weeks'
Thu Aug 25 00:00:00 EST 2011
$ date -d 'Jan 1 1982 + 11 weeks'
Fri Mar 19 00:00:00 EST 1982

두 날짜 간의 차이를 계산하는 쉬운 방법은 모르지만 쉘 함수를 사용하여 날짜(1)에 대한 일부 논리를 래핑할 수 있습니다.

datediff() {
    d1=$(date -d "$1" +%s)
    d2=$(date -d "$2" +%s)
    echo $(( (d1 - d2) / 86400 )) days
}
$ datediff '1 Nov' '1 Aug'  # Note: answer should be 92 days but in my timezone, DST starts between the dates.
91 days

다른 방법으로 날짜를 계산하려면 을 바꾸 d1거나 d2화려하게 만들어 관련성이 없도록 만드세요. 또한, 일광 절약 시간이 적용되지 않는 경우여름 시간간격이 전환되면 하루 중 하루의 길이는 23시간에 불과합니다. 총 시간에 ½일을 추가하여 보상할 수 있습니다.

echo $(( (((d1-d2) > 0 ? (d1-d2) : (d2-d1)) + 43200) / 86400 )) days

답변2

휴대용 도구 세트를 찾으려면 내 도구를 사용해 보세요.날짜 도구. 두 가지 예를 한 문장으로 요약할 수 있습니다.

ddiff 2011-11-15 2012-04-11
=>
  148

또는 몇 주 또는 며칠 내에:

ddiff 2011-11-15 2012-04-11 -f '%w %d'
=>
  21 1

그리고

dadd 2011-11-15 21w
=>
  2012-04-10

Ubuntu 설치에 대한 중요 참고 사항:

이와 똑같은 dateutil을 다음과 같이 사용할 수 있습니다.우분투 패키지이므로 설치할 수 있습니다 sudo apt install dateutils.

그러나 명령 앞에는 다음 dateutils.과 같은 접두사가 와야 합니다.dateutils.ddiff 2019-03-28 2019-05-16

RHEL용 Fedora 및 Fedora EPEL이나 .Fedora sudo dnf install dateutils에서 이러한 패키지는 접두사가 필요하지 않고 대신 긴 이름을 사용 합니다 .datediffdateaddddiffdadd

Arch Linux의 경우 Fedora에서와 마찬가지로 이 바이너리를 and sudo pacman -Sy dateutils라고 합니다 .datediffdateadd

답변3

내가 지구를 걸은 일수를 계산하는 Python 예제:

$ python
>>> from datetime import date as D
>>> print (D.today() - D(1980, 6, 14)).days
11476

답변4

이 문제는 생년월일 가져오기(가계도에 사용됨)를 사용할 때 발생합니다 date -d "$death_date - $y years - $m months - $d days". 이 명령은 잘못되었습니다. 따라서 달의 길이가 모두 정확히 같은 것은 아닙니다 (date + offset) - offset != date. 나이는 생년월일부터 계산됩니다.

$ date --utc -d 'mar 28 1867 +72years +11months +2days'
Fri Mar  1 00:00:00 UTC 1940

$ date --utc -d 'mar 1 1940 -72years -11months -2days'
Sat Mar 30 00:00:00 UTC 1867
# (2 days later than our starting point)

Date는 두 경우 모두 올바른 출력을 제공하지만 두 번째 경우에는 잘못된 질문을 하는 것입니다. 일수를 더하거나 빼기 전에 1년 중 어느 11개월 +/- 11이 포함되는지가 중요합니다. 예를 들어:

$ date --utc -d 'mar 31 1939  -1month'
Fri Mar  3 00:00:00 UTC 1939
$ date --utc -d 'mar 31 1940  -1month' # leap year
Sat Mar  2 00:00:00 UTC 1940
$ date --utc -d 'jan 31 1940  +1month' # leap year
Sat Mar  2 00:00:00 UTC 1940

뺄셈이 덧셈의 역이 되려면 연산 순서가 반대가 되어야 합니다. 연도, 월, 일을 추가합니다. 뺄셈을 역순으로 사용하면 시작한 곳으로 돌아오게 됩니다. 그렇지 않으므로 일 오프셋이 길이가 다른 달의 월 경계를 넘는 경우에는 그렇지 않습니다.

종료 날짜 및 연령부터 거꾸로 작업해야 하는 경우 여러 호출을 사용하여 수행할 수 있습니다 date. 먼저 일수, 월수, 연수를 뺍니다. ( date윤년으로 인해 2월의 길이가 변경되므로 연도와 월을 한 번의 호출로 결합하는 것은 안전하지 않다고 생각합니다 .)

관련 정보