Programing

리눅스에서 bash로 어제 날짜 가져 오기, DST 안전

lottogame 2020. 6. 20. 10:41
반응형

리눅스에서 bash로 어제 날짜 가져 오기, DST 안전


Linux에서 실행되는 쉘 스크립트가 있으며이 호출을 사용하여 어제 날짜를 YYYY-MM-DD형식으로 가져옵니다 .

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

대부분의 시간에 작동하지만 스크립트가 어제 아침에 실행되면 대신 대신에 2013-03-11 0:35 CDT반환 "2013-03-09"되었습니다 "2013-03-10".

아마도 일광 절약 시간제 (어제 시작)는 책임이 있습니다. 나는 방법은 추측하고있어 "1 day ago"그 전에 24 시간 24 시간을 뺀 구현 2013-03-11 0:35 CDT했다 2013-03-09 23:35 CST의 결과에지도하는 "2013-03-09".

그렇다면 리눅스의 bash에서 어제 날짜를 얻는 좋은 DST 안전 방법은 무엇입니까?


얼마나 자주 그리고 언제 실행하는지에 관계없이 이것이 작동해야한다고 생각합니다 ...

date -d "yesterday 13:00" '+%Y-%m-%d'

Mac OSX에서의 배쉬는 약간 다릅니다.

어제

echo `date -v-1d +%F`

지난주

echo `date -v-1w +%F`

이것은 또한 작동해야하지만 아마도 너무 많습니다.

date -d @$(( $(date +"%s") - 86400)) +"%Y-%m-%d"

스크립트가 하루 중 첫 시간에 실행된다고 확신하는 경우 간단하게 수행 할 수 있습니다.

  date -d "12 hours ago" '+%Y-%m-%d'

BTW, 스크립트가 매일 00:35 (크론 탭을 통해)에 실행되면 DST 변경이 그 시간에 빠지면 어떻게 될지 스스로에게 문의해야합니다. 스크립트를 실행할 수 없거나 경우에 따라 두 번 실행할 수 없습니다. 현대 구현 cron되어 아주 똑똑 하지만,이 점이다.


여기에 Solaris 및 AIX에서도 작동하는 솔루션이 있습니다.

시간대를 조작하면 몇 시간 동안 시계를 변경할 수 있습니다. 일광 절약 시간 제로 인해 24 시간 전은 오늘 또는 어제 전날이 될 수 있습니다.

어제는 20 시간 또는 30 시간 전입니다. 어느 것? 글쎄, 오늘이 아닌 가장 최근의 것.

echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

echo 명령에 사용 된 -e 매개 변수는 bash와 함께 필요하지만 ksh에서는 작동하지 않습니다. ksh에서는 -e 플래그없이 동일한 명령을 사용할 수 있습니다.

다른 환경에서 스크립트를 사용하는 경우 #! / bin / ksh 또는 #! / bin / bash를 사용하여 스크립트를 시작할 수 있습니다. \ n을 줄 바꿈으로 바꿀 수도 있습니다.

echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

당신이 사용할 수있는

date -d "30 days ago" +"%d/%m/%Y"

30 일 전에 날짜를 얻으려면 마찬가지로 30 일을 x 일로 바꿀 수 있습니다


date초만 사용 하고 신뢰할 수 있습니다.

올바르게 지적했듯이 영어 시간 산술에 의존하면 기본 계산에 대한 많은 세부 정보가 숨겨집니다. 예를 들어 -d yesterday, -d 1 day ago다른 행동을 할 것입니다.

대신, 유닉스 시대 UTC 이후 (정확하게 문서화 된) 초와 bash 산술에 의존하여 원하는 순간을 얻을 수 있습니다.

date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"

이것은 또 다른 대답 에서 지적되었습니다 . 이 형식은 다른 date명령 줄 플래그가있는 플랫폼에서보다 이식성이 뛰어나고 언어에 독립적이며 (예 : 프랑스어 로케일의 "어제"대 "계층") 솔직히 (장기적으로) 기억하기 쉬울 것입니다. 이미 알고 있습니다. 그렇지 않으면 자신을 물어 유지 될 수 있습니다 "그것이 -d 2 hours ago-d 2 hour ago다시?" 또는 " 그렇 -d yesterday거나 -d 1 day ago원하는가?"). 여기서 가장 까다로운 부분은 @입니다.

bash로 무장하고 다른 것은 없습니다.

배쉬에만 배쉬하면 printf 내장을 통해 어제 시간을 얻을 수도 있습니다.

 %(datefmt)T
     causes printf to output the date-time string resulting from using
     datefmt as a format string for strftime(3).  The  corresponding  argu‐
     ment  is an integer representing the number of seconds since the
     epoch.  Two special argument values may be used: -1 represents the
     current time, and -2 represents the time the shell was invoked.
     If no argument is specified, conversion behaves as if -1 had
     been  given.
     This is an exception to the usual printf behavior.

그래서,

# inner printf gets you the current unix time in seconds
# outer printf spits it out according to the format
printf "%(%Y-%m-%d)T\n" $(( $(printf "%(%s)T" -1) - 24*3600 ))

또는 temp 변수와 동일합니다 (외부 서브 쉘은 선택 사항이지만 환경 변수를 깨끗하게 유지합니다).

(
  now=$(printf "%(%s)T" -1);
  printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)

Note: despite the manpage stating that no argument to the %()T formatter will assume a default -1, i seem to get a 0 instead (thank you, bash manual version 4.3.48)

참고URL : https://stackoverflow.com/questions/15374752/get-yesterdays-date-in-bash-on-linux-dst-safe

반응형