쉘 스크립트에서 지난 달의 마지막 날짜를 가져옵니다.


11

처리 일을 기준으로 전월 종료일을 어떻게 알 수 있습니까?

예 :

  • 처리 일 = 15jan2015
  • 예상 날짜 = 31dec2014,

  • 처리 일 = 10feb2015
  • 예상 날짜 = 31jan2015

답변:


27

GNU로 date:

$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015

일부 셸은 날짜 조작을 기본적으로 지원합니다.

ksh93:

$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015

zsh:

$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015

4

있습니다 많은 방법 이 작업을 수행하려면; 여기 내가 찾은 가장 간단한 것이 있습니다 (여기서는 GNU라고 가정 date).

$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015

1
@stephane의 대답은 더 명확하며, 한 달 중순에 건너 뛰거나 추가 된 날이 몇 년이 지나면 작동하지 않습니다. 그렇습니다. 참조 youtube.com/watch?v=-5wpm-gesOY을
CTRL-ALT-delor

GNU 날짜 날짜 오프셋이 작동 하는 방식 인 @richard (1 일 오프셋은 24 시간과 동일하지 않음), 나는이 답변과 광산이 동일해야하며 한 달의 마지막 날을 건너 뛸 시간대에서만 실패한다고 생각합니다 ( 일반적으로, 만약 그런 일이 일어난다면 아마도 태평양 섬에서 -12 : 00 오프셋으로 12:00 오프셋 (또는 -13에서 11로 ...)으로 전환 할 것입니다.
Stéphane Chazelas

@Stephane 다른 문제를 지적 해 주셔서 감사합니다. 솔루션에서 월 중순이 제거 된 경우 (이 경우) 30 일이 30 일이 아니므로 30을 빼면 이전 달의 마지막 날로 이동하지 않습니다. 매월 1 일 (보증되지 않음)이있는 경우 왜 이것이 작동하지 않는지 알 수 없습니다. 그러나 이것이 의미하는 것은 아닙니다.
ctrl-alt-delor

@richard, 참조 TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '1 day ago'. 2011-12-30이 없기 때문에 오류가 발생합니다. 즉, 날짜 오프셋 은 달력 시간에 수행되었습니다. 2011-12-31에서 31 일을 뺀 31 일은 31 분의 31이 걸리기 때문에 2011-11-30을 제공합니다. 현재 시간에서 31 * 24 * 60 * 60 * 60 초가 걸리지 않습니다. TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'29 일, 즉 이번에는 24 * 60 * 60 * 60 초 전인 날짜 와 비교하십시오 .
Stéphane Chazelas

2

BSD date유틸리티 를 사용하는 Mac OS에서 작동하는 버전은 다음과 같습니다 .

date -v1d -v-1d +%d%b%Y

인수는 순서대로 적용됩니다. 날짜가 한 인수에서 다음 인수로 파이프된다고 상상할 수 있습니다. 예를 들면 다음과 같습니다.

  • 현재 날짜로 시작 ( date)-> 2017-03-06
  • 해당 날짜를 해당 월의 첫째 날 ( -v1d)-> 2017-03-01로 설정하십시오.
  • 그것에서 하루 빼기 ( -v-1d)-> 2017-02-28
  • 날짜 형식 ( +%d%b%Y)-> 28Feb2017

당신은 사용 개월 앞으로 또는 뒤로의 수를 도달 할 수있는 date -v-1m -v1d -v-1d대체 -1m전달 개월 뒤로 또는 수 (로 +1m당신이 원하는).

이것이 일반적인 대답입니다. 이 질문은 구체적으로 시작 날짜와 관련된 날짜를 묻습니다. Mac OS / BSD 날짜 유틸리티를 사용하면 시작 날짜 스탬프를 제공 할 수 없지만 각 날짜 요소를 개별적으로 설정할 수 있습니다.

date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 31Dec2014


0

이 코드를 사용해보십시오

date -d "-$(date +%d) days  month" +%Y-%m-%d

달 의 마지막 날을 알려줍니다 .
워렌 영
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.