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일로 대체할 수 있습니다.
그냥 사용하다date
trusty 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
'sourcecode' 카테고리의 다른 글
텍스트 블록을 WPF ListBox로 강제 랩하다 (0) | 2023.04.14 |
---|---|
간접 확장이란 무엇입니까?${!var*}의 의미는 무엇입니까? (0) | 2023.04.14 |
새로운 행의 패턴을 grep로 지정하는 방법은 무엇입니까? (0) | 2023.04.14 |
XAML에서 이미지 리소스를 참조하는 방법 (0) | 2023.04.14 |
Objective-C에서 문자열이 비어 있는지 테스트하려면 어떻게 해야 합니까? (0) | 2023.04.14 |