나는 종종 다음과 같은 몇 가지 빠른 날짜 계산을 수행하고 싶습니다.
- 이 두 날짜의 차이점은 무엇입니까?
- 오늘 날짜는 언제인가요?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
에서 이러한 패키지는 접두사가 필요하지 않고 대신 긴 이름을 사용 합니다 .datediff
dateadd
ddiff
dadd
Arch Linux의 경우 Fedora에서와 마찬가지로 이 바이너리를 and sudo pacman -Sy dateutils
라고 합니다 .datediff
dateadd
답변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월의 길이가 변경되므로 연도와 월을 한 번의 호출로 결합하는 것은 안전하지 않다고 생각합니다 .)