날짜: 현재 15분 간격을 가져옵니다.

날짜: 현재 15분 간격을 가져옵니다.

date 명령이나 이와 유사한 명령을 사용하여 현재 15분 간격을 얻는 방법이 있습니까?

예를 들어, 날짜와 같은 항목은 %Y.%m.%d %H:%M 에서 까지의 시간 범위에서 2011.02.22 10:19생성해야 하는 항목을 제공합니다.2011.02.22 10:1510:1510:29

답변1

현재 유닉스 타임스탬프를 얻고 date "+%s"간단한 수학으로 현재 분기 시간을 찾은 다음(예제는 에 있음 bash) 더 나은 형식으로 다시 인쇄할 수 있습니다 date.

curdate=`date "+%s"`
curquarter=$(($curdate - ($curdate % (15 * 60))))
date -d"@$curquarter"

타임스탬프에서 현재 날짜와 시간을 설정하는 구문은 @현재까지의 GNU 확장입니다. OS에서 작동하지 않는 경우 이와 동일한 작업을 수행할 수 있습니다(UTC를 지정하는 것을 잊지 마세요. 그렇지 않으면 작동하지 않습니다). 일하지 않음):

date -d"1970-01-01 $curquarter seconds UTC"

답변2

다음 메서드를 사용하면 이를 date두 번 호출할 필요가 없습니다.
시스템 호출 오버헤드로 인해 "간단한" 명령은 자체 로컬 환경에서 동일한 작업을 수행하는 bash보다 100배 느려질 수 있습니다.

고쳐 쓰다위에서 내 의견을 언급하자면 "100배 느림"입니다. 이제 "를 읽을 수 있습니다.500여러 번 느림"... 최근에 이 문제에 대해 막혔습니다(아니요, 맹목적으로). 링크는 다음과 같습니다.테스트 파일을 작성하는 빠른 방법

eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
[[ "$M" < "15" ]] && M=00 # cater for octal clash
M=$(((M/15)*15))
((M==0)) && M=00 # the math returns 0, so make it 00  
echo $Y.$m.$d $H:$M  

또는

eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
if   [[ "$M" < "15" ]] ; then M=00
elif [[ "$M" < "30" ]] ; then M=15
elif [[ "$M" < "45" ]] ; then M=30
else M=45
fi
echo $Y.$m.$d $H:$M

두 버전 모두 반환됩니다.

2011.02.23 01:00
2011.02.23 01:15
2011.02.23 01:30
2011.02.23 01:45   

이것은 60개의 값을 모두 테스트하는 첫 번째 루프입니다. ​​{00..59}

for X in {00..59} ;                         ###### TEST
do                                          ###### TEST 
  eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
  M=$X                                      ###### TEST 
  [[ "$M" < "15" ]] && M=00 # cater for octal clash
  M=$(((M/15)*15))
  ((M==0)) && M=00 # the math returns 0, so make it 00  
  echo $Y.$m.$d $H:$M 
done                                        ###### TEST 

답변3

이것이 쉘에서 날짜를 처리하는 방법입니다. 먼저 호출 date하여 구성 요소를 가져오고 위치 인수( 등)를 구성 요소로 채웁니다 $1( $2이는 $(…)문자열을 단어로 나누기 위해 큰따옴표 외부를 실제로 사용하려는 드문 경우 중 하나입니다). 그런 다음 산술, 테스트 또는 구성 요소에 대해 수행해야 하는 모든 작업을 수행합니다. 마지막으로 구성요소를 조립합니다.

0산술 부분은 쉘이 이를 8진수 접두어로 처리하기 때문에 약간 까다로울 수 있습니다. 예를 들어, 이는 $(($5/15))8시간 또는 9분 후에 실패합니다. 리더 0는 최대 1개이므로 ${5#0}연산에 안전합니다. 100을 더한 다음 빼는 것은 1출력에서 ​​고정된 수의 비트를 얻는 한 가지 방법입니다.

set $(date "+%Y %m %d %H %M")
m=$((100+15*(${5#0}/15)))
last_quarter_hour="$1.$2.$3 $4:${m#1}"

답변4

일부 쉘은 외부 명령을 호출하지 않고 이를 수행합니다 date.

a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "#$((a-a%(15*60)))"
a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "$((a-a%(15*60)))"
zmodload zsh/datetime; a=$EPOCHSECONDS; strftime '%Y-%m-%d %H:%M' $((a-a%(15*60)))

위의 세 가지는 현지(UTC가 아닌) 시간을 제공합니다. 필요한 경우 앞에 TZ=UTC0을 사용합니다.

ksh와 bash 구문은 거의 동일합니다( #ksh에서 필요한 경우 제외). zsh를 사용하려면 모듈(zsh 배포판에 포함됨)을 로드해야 합니다.

이는 (GNU) awk를 사용하여 수행할 수도 있습니다.

awk 'BEGIN{t=systime();print strftime("%Y.%m.%d %H:%M",t-t%(15*60),1)}'

로컬이 필요한 경우 UTC 결과가 제공됩니다(마지막 결과를 1로 변경). 0그러나 외부 awk 또는 외부 zsh 모듈을 로드하는 것은 날짜 자체를 호출하는 것만큼 느릴 수 있습니다.

a=$(date +%s); date -ud "@$((a-a%(15*60)))" +'%Y.%m.%d %H:%M'

작은 실행 파일도 busybox비슷한 결과를 제공할 수 있습니다.

a=$(busybox date +%s);busybox date -ud "@$((a-a%(15*60)))" +'%Y.%m.%d %H:%M'

busybox가 PATH 디렉터리의 해당 이름에 연결된 경우 앞에 있는 busybox 단어를 생략할 수 있습니다.

date위의 두 가지 모두 busybox dateUTC 시간을 인쇄합니다. -u현지 시간 옵션이 제거되었습니다 .


운영 체제에 더 제한된 날짜 버전(사용해야 함)이 있는 경우 다음을 시도해 보십시오.

a=$(date +%s); a=$(( a-a%(15*60) ))
date -d"1970-01-01 $a seconds UTC" +'%Y.%m.%d %H:%M'

또는 FreeBSD의 경우 다음을 시도해 보세요.

a=$(date +%s); a=$(( a-a%(15*60) ))
date -r "$a" +'%Y.%m.%d %H:%M'

관련 정보