리눅스에서 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
'Programing' 카테고리의 다른 글
Numpy-배열에 행 추가 (0) | 2020.06.20 |
---|---|
jQuery에서 요소의 n 번째 수준 부모를 얻으려면 어떻게해야합니까? (0) | 2020.06.20 |
값으로 객체를 제거하는 배열 확장 (0) | 2020.06.20 |
Java의 각 루프마다 역순으로 할 수 있습니까? (0) | 2020.06.20 |
최대 높이를 설정 해제하는 방법? (0) | 2020.06.19 |