사용 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
원하는가?"). 여기서 가장 까다로운 부분은 @
입니다.
배쉬로 무장하고 다른 것은 없습니다.
배쉬에만 배쉬하면 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));
)
참고 : 맨 페이지에 %()T
포맷터에 대한 인수가 기본값 을 사용하지 않는다는 내용이 -1
있지만 대신 0을 얻는 것 같습니다 (감사합니다, bash 매뉴얼 버전 4.3.48).