일수에 관계없이 이전 달을 가져옵니다.

일수에 관계없이 이전 달을 가져옵니다.

Linux에서는 다음 명령을 사용하여 지난달 정보를 얻을 수 있습니다.

date -d "last month" '+%Y%m'

또는

date -d "1 month ago" '+%Y%m'

그런데 오늘이 3월 31일이라고 가정하고, 상단에 명령을 실행하면 201603이라고 나오는데, 지금이 무슨 요일이든 지난 달의 정보를 얻고 싶은데 어떻게 해야 합니까?

지난달의 첫날/마지막 날을 얻는 것과 같은 해결 방법을 사용하여 이를 달성할 수 있지만 이를 수행할 수 있는 우아한 방법이 있는지 궁금합니다.

 date -d "-$(date +%d) days" '+%Y%m'     #get last day of previous month

답변1

일반적으로 매월 15일을 사용합니다. 그런 다음 1개월을 뺍니다.

$ nowmonth=$(date +%Y-%m)
$ date -d "$nowmonth-15 last month" '+%Y%m'
201602

답변2

GNU date당신이 생각하는 것처럼 산술에는 특별히 적합하지 않습니다. 그게 내가 글을 쓴 이유 중 하나야dateutils.

귀하의 예는 다음과 같이 요약됩니다.

$ dateadd today -1mo -f '%Y%m'
201603

그리고 3월 31일에 올바른 일을 했습니다:

$ dateadd 2016-03-31 -1mo -f '%Y%m'
201602

또는 오늘 날짜에 관계없이 귀하의 의견이 의미하는 것(이전 달의 마지막 날 가져오기)은 다음과 같습니다.

$ dateround --next today -31d
2016-03-31
$ dateround --next 2016-03-31 -31d
2016-02-29

답변3

내 접근 방식은 날짜 산술을 적용하기 전에 항상 알려진 신뢰할 수 있는 날짜를 사용하는 것입니다. 이 경우 해당 월의 첫날을 얻은 다음 어느 날로 돌아갑니다.

date --date "$(date +%Y-%m-01) -1 day"

일부 시간대에서는 월 경계에서 윤초(UTC 23:59 이후 61초) 동안 실행하면 중단될 수 있습니다. 우리는 1999년 12월 31일에 하나를 가지고 있었지만 가장 최근의 것도 한 달 이내인지 확인하지 않았습니다.

답변4

나는 몇 년 전에 같은 질문을 받았고 "1개월 전"이 실제로 무엇을 하는지에 대해 꽤 좋은 대답을 얻었습니다.

@rici의 답변 일부 인용

  • 1개월은 월 번호에서 1을 뺀 후 결과 날짜가 유효하지 않은 경우(예: 2월 30일) 이를 조정하여 유효하게 만듭니다. 따라서 12월 31일~첫 번째 달은 11월의 하루가 아닌 12월 1일이 되며, 3월 31일~첫 번째 달은 3월 3일이 됩니다(윤년인 경우 제외).

자세한 내용은 아래를 참조하세요답변

관련 정보