date 명령이나 이와 유사한 명령을 사용하여 현재 15분 간격을 얻는 방법이 있습니까?
예를 들어, 날짜와 같은 항목은 %Y.%m.%d %H:%M
에서 까지의 시간 범위에서 2011.02.22 10:19
생성해야 하는 항목을 제공합니다.2011.02.22 10:15
10:15
10: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 모듈을 로드하는 것은 날짜 자체를 호출하는 것만큼 느릴 수 있습니다.
GNU 날짜 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 date
UTC 시간을 인쇄합니다. -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'