본문 바로가기

os/리눅스

GNU date bug

MySQL → BigQuery 적재 작업을 6시간 윈도우(0~6, 6~12, 12~18, 18~24)로 돌리려 했는데, 실제 실행 로그는 00~04, 06~10처럼 4시간 간격으로 잘렸습니다. 

 

#!/bin/bash
set -x


# ────────────────────────────────
# 0~6, 6~12, 12~18, 18~24 (총 4회)
# 마지막 구간은 오늘 날짜 테이블에 append
# ────────────────────────────────
YESTERDAY_DATE=$(date -d "yesterday" "+%Y-%m-%d")
YESTERDAY=$(date -d "yesterday" "+%Y%m%d")
TODAY_DATE=$(date "+%Y-%m-%d")
TODAY=$(date "+%Y%m%d")

source ~/.bashrc

for HOUR in 0 6 12 18; do
  START_STR="${YESTERDAY_DATE} $(printf "%02d" $HOUR):00:00"

  if [ "$HOUR" -eq 18 ]; then
    # 마지막 구간: 어제 18시 ~ 오늘 00시
    END_STR="${TODAY_DATE} 00:00:00"
    TABLE_DATE="$TODAY"
  else
    END_STR=$(date -d "$START_STR +6 hours" "+%Y-%m-%d %H:%M:%S")
    TABLE_DATE="$YESTERDAY"
  fi

  export START_STR
  export END_STR
  export YESTERDAY="$TABLE_DATE"
  echo "${START_STR}"
  echo "${END_STR}"
  echo "▶ 실행: ${START_STR} ~ ${END_STR}"

done

 

하지만 결과는?

+ echo '2025-09-23 00:00:00'
2025-09-23 00:00:00
+ echo '2025-09-23 04:00:00'
2025-09-23 04:00:00
+ echo '▶ 실행: 2025-09-23 00:00:00 ~ 2025-09-23 04:00:00'

 

 

뭐지??????????????????????????????????????????????????????????????????????????????????

4는 아예 있지 도 않는데 왜 4를 더한거여?

 

 

코드에서 +를 뺴니 정상적으로 출력된다. 

ND_STR=$(date -d "$START_STR 6 hours" "+%Y-%m-%d %H:%M:%S")
+ echo '2025-09-23 00:00:00'
2025-09-23 00:00:00
+ echo '2025-09-23 06:00:00'
2025-09-23 06:00:00
+ echo '▶ 실행: 2025-09-23 00:00:00 ~ 2025-09-23 06:00:00'

 

 

뭐지???

 

검색 결과 나와 같은 결과물을 겪은 사람들이 보였다. 

https://community.unix.com/t/bug-in-gnu-date/374044

 

Bug in Gnu date?

So as I write this today is two days after the clocks go back here in the UK. I have a script that worked last week. Yesterday it developed a bug. I eventually found the culprit is Gnu Date. $ lsb_release -a No LSB modules are available. Distributor ID: Ub

community.unix.com

 

 

 

실제 원인

GNU date의 상대시간 파싱 케이스 때문

END_STR=$(date -d "$START_STR +6 hours" "+%Y-%m-%d %H:%M:%S")

Jenkins 로그에서 실제 결과가 +6h → +4h로 잘려 나오는 현상이 재현됨.
즉, "$START_STR +6 hours" 형태가 환경/버전에 따라 잘못 해석되는 문제가 있었고,
"$START_STR 6 hours" 또는 "6 hours $START_STR"처럼 쓰면 정상(+6h)으로 동작

 

 

 

Date 디버깅

1. UTC+06 로 변경

2. 섬머타임 1시간 적용 

결국 -9+6+1로 4시간만 적용된것.

$ date --debug -d "$START_STR +6 hours" "+%Y-%m-%d %H:%M:%S"
date: parsed date part: (Y-M-D) 2025-09-23
date: parsed time part: 00:00:00 UTC+06
date: parsed relative part: +1 hour(s)
date: input timezone: parsed date/time string (+06)
date: using specified time as starting value: '00:00:00'
date: starting date/time: '(Y-M-D) 2025-09-23 00:00:00 TZ=+06'
date: '(Y-M-D) 2025-09-23 00:00:00 TZ=+06' = 1758564000 epoch-seconds
date: after time adjustment (+1 hours, +0 minutes, +0 seconds, +0 ns),
date:     new time = 1758567600 epoch-seconds
date: timezone: system default
date: final: 1758567600.000000000 (epoch-seconds)
date: final: (Y-M-D) 2025-09-22 19:00:00 (UTC)
date: final: (Y-M-D) 2025-09-23 04:00:00 (UTC+09)
2025-09-23 04:00:00

 

+를 없애고 실행하면 

1. +6시간 수행 

으로 끝나서 원하는 결과값을 얻게 된다. 

date --debug -d "$START_STR 6 hours" "+%Y-%m-%d %H:%M:%S"
date: parsed date part: (Y-M-D) 2025-09-23
date: parsed time part: 00:00:00
date: parsed relative part: +6 hour(s)
date: input timezone: system default
date: using specified time as starting value: '00:00:00'
date: starting date/time: '(Y-M-D) 2025-09-23 00:00:00'
date: '(Y-M-D) 2025-09-23 00:00:00' = 1758553200 epoch-seconds
date: after time adjustment (+6 hours, +0 minutes, +0 seconds, +0 ns),
date:     new time = 1758574800 epoch-seconds
date: timezone: system default
date: final: 1758574800.000000000 (epoch-seconds)
date: final: (Y-M-D) 2025-09-22 21:00:00 (UTC)
date: final: (Y-M-D) 2025-09-23 06:00:00 (UTC+09)
2025-09-23 06:00:00

 

 

결론 

리눅스 GUN date 함수를 쓸때는 꼭!꼭꼭! 확인하면서 쓰자...

(이걸로 오늘 오전이 날라갔다..)

 

'os > 리눅스' 카테고리의 다른 글

[Linux] gzip - 압축하기, 압축풀기  (0) 2025.07.01
ubuntu docker  (0) 2018.10.24
ubuntu init && node install  (0) 2018.08.19
ubuntu port forwarding  (0) 2018.08.15
ubuntu jupyter 설치  (0) 2016.08.26