두 값 사이의 타임스탬프 생성

두 값 사이의 타임스탬프 생성

2개의 타임스탬프 값 사이에 30분 간격으로 타임스탬프 시리즈를 생성하려고 합니다.

이것이 제가 준비한 것입니다.

start_ts='2021-08-07 15:00:00'
end_ts='2021-08-11 05:00:00'

while ! [[ $start_ts > $end_ts ]]; do
    echo $start_ts
    start_ts=$(date -d "$start_ts + 30 minutes" +"%Y%m%d% H%:%M:%S")
done

하지만 이 오류가 발생합니다.

date: invalid date ‘ 2021-08-07 15:00:00 + 30 minutes’

답변1

특정 문제는 + 30유효하지 않은 것으로 해석되는 시간대입니다.

UTC 시간(DST 변경 문제 방지)을 사용하여 이 문제를 해결하고 다음을 사용할 수 있습니다.

date -ud "$start_ts +0 + 30 minutes" +'%Y%m%d %T'

(+0은 UTC에서 시간대 오프셋 0을 지정하므로 다음은 +30 minute오프셋으로 해석됩니다.)

또는 현지 시간을 계속 사용하려면 타임스탬프 뒤에 today또는를 삽입하여 now뒤따르는 내용이 오프셋으로 해석되도록 하세요.

date -d "$start_ts now + 30 minutes" +'%Y%m%d %T'

여기서 GNU 특정 확장을 사용하면 다음을 수행할 수 있습니다.

start_ts=$(date -ud '2021-08-07 15:00:00' +%s)
end_ts=$(date -ud '2021-08-11 05:00:00' +%s)

seq -f "@%.0f" "$start_ts" "$((30 * 60))" "$end_ts" |
  date -uf - +'%Y%m%d %T'

date타임스탬프당 하나씩 실행되는 것을 방지합니다 . 이는 seq표준 명령은 아니지만 GNU가 있으면 동일한 GNU 패키지( )의 일부인 GNU date도 있다는 점에 유의하세요.seqcoreutils

또는 타임스탬프 구문 분석 및 형식 지정을 기본적으로 지원하는 zsh 셸을 사용하면 GNU에 대한 의존성을 피할 수 있습니다 date.

#! /bin/zsh -
zmodload zsh/datetime

format='%Y%m%d %T'
TZ=UTC0 strftime -rs start_ts $format '20210807 15:00:00'
TZ=UTC0 strftime -rs end_ts   $format '20210811 05:00:00'
for ((t = start_ts; t <= end_ts; t += 30 * 60))
  TZ=UTC0 strftime $format $t

이는 귀하의 시간대의 특정 시간과 일치하지 않는 타임스탬프를 생성할 수 있다는 점에 유의하십시오. 예를 들어, 여기 영국 본토에서는 2021-03-28 01:30:00그날 일광 절약 시간제로 전환하면 벽시계 시간이 00:59:59.99에서 02:00:00.00으로 곧바로 이동합니다. 대신 2021년 10월 31일에는 01:00:00부터 02:00:00까지의 타임스탬프가 두 번 표시됩니다. 위 코드는 01:00 -> 02:00을 초과하지 않고 해당 날짜의 00:30:00, 01:00:00, 01:30:00, 02:00:00, 02:30:00에서 계속 반복됩니다. 두 번 간격을 두었습니다.

이것이 원하는 것이 아니라면 UTC 시간( 및 -u) 과 함께 작동하도록 만드는 부분을 제거해야 합니다 +0. TZ=UTC0그러나 타임스탬프가 모호하지 않도록 형식에는 시간대 오프셋( %z)이 포함되어야 합니다(시간대 오프셋을 항상 몇 분 정도 소요됩니다. 현재 모든 곳에서 그렇습니다.)

관련 정보