sourcecode

Linux, DST-safe에서 bash로 어제 날짜 가져오기

copyscript 2023. 4. 14. 22:01
반응형

Linux, DST-safe에서 bash로 어제 날짜 가져오기

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".

그렇다면 Linux에서 어제 날짜를 bash로 가져오는 DST 안전한 방법은 무엇일까요?

실행 빈도와 시간에 관계없이 이 기능은 작동해야 한다고 생각합니다.

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

Mac OSX에서는 다음과 같이 약간 다르게 작동합니다.

어제를 위해서

date -v-1d +%F

전주의 경우

date -v-1w +%F

이것 또한 효과가 있을 것입니다만, 아마 너무 과한 것 같습니다.

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

스크립트가 하루 중 첫 시간에 실행되는 것이 확실하다면 간단히 다음 작업을 수행할 수 있습니다.

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

스크립트가 매일 00:35에 실행되는 경우(crontab 경유)이 시간에 DST 변경이 발생하면 어떻게 되는지 자문해야 합니다.스크립트를 실행할 수 없거나 경우에 따라서는2회 실행할 수 없습니다.의 최신 구현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 "yesterday" '+%Y-%m-%d'

나중에 사용하려면:

date=$(date -d "yesterday" '+%Y-%m-%d')

사용할 수 있습니다.

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

30일 전의 날짜를 얻으려면 마찬가지로 30일을 x일로 대체할 수 있습니다.

그냥 사용하다datetrusty seconds (신뢰초):

당신이 정확히 지적했듯이, 당신이 영어 시간 계산에 의존한다면, 기초적인 계산에 대한 많은 세부 사항들이 숨겨져 있습니다.예.-d yesterday,그리고.-d 1 day ago동작은 다릅니다.

대신 unix Epoch UTC 이후 (정확히 문서화되어 있는) 초수를 신뢰하고 bash 계산을 통해 원하는 순간을 얻을 수 있습니다.

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

이것은 또 다른 답변에서 지적되었다.이 폼은 다양한 플랫폼 간에 보다 휴대성이 뛰어납니다.date명령줄 플래그는 언어에 의존하지 않으며(예를 들어 프랑스어 로케일의 경우 "어제" vs "hier"), 솔직히 (장기적으로는) 이미 알고 있기 때문에 기억하기 쉬워집니다.?'라고 "어디서?"-d 2 hours ago ★★★★★★★★★★★★★★★★★」-d 2 hour ago요?아니면요?-d yesterday ★★★★★★★★★★★★★★★★★」-d 1 day ago원하는 것?)여기서 유일하게 까다로운 부분은@.

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

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 ))

또는 온도 변수(서브셸은 선택 사항이지만 환경 변수를 청결하게 유지함)와 동일하게 사용할 수 있습니다.

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

주의: manpage에 다음과 같이 기술되어 있는데도%()T 「Default」를 로 합니다.-1 것 manual 4.3.48 0은 0입니다(bash manual 4.3.48).

다음을 사용할 수 있습니다.

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

또는 원하는 시간을 bash에 의해 가져옵니다.

월:

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

이 질문에는 bash "DST safe"라는 태그가 붙어 있습니다.

하여 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」date명령어 incomie delay는 순수 bash 빌트인을 사용하는 단순하고 효율적인 방법이 있습니다.

printf -v tznow '%(%z %s)T' -1
TZ=${tznow% *} printf -v yesterday '%(%Y-%m-%d)T' $(( ${tznow#* } - 86400 ))
echo $yesterday

이 방법은 시스템 친화성이 높은 경우 포크를 사용하는 것보다 훨씬 빠릅니다.date.

bash 버전 5.0부터 변수가 추가되었습니다.$EPOCHSECONDS

printf -v tz '%(%z)T' -1
TZ=$tz printf -v yesterday '%(%Y-%m-%d)T' $(( EPOCHSECONDS - 86400 ))
echo $yesterday

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

반응형