"-d"/"--date=" 옵션과 함께 "date" 사용

"-d"/"--date=" 옵션과 함께 "date" 사용

date나는 이것을 사용하여 Raspberry Pi의 실시간 시계에 대한 미래의 "알람 시간"을 계산하고 싶습니다 . 이러한 "알람 시간"은 RPi를 "깨우기" 위해 사용됩니다.

내가 사용하기로 결정한 솔루션은 다음과 같습니다.

  1. 시작 직후, 내가 선택한 형식으로 현재 "기준" 시간이 표시됩니다.

    $ BASETIME=$(date "+%D %X")
    $ echo $BASETIME
    05/03/21 14:03:43
    
  2. 이전에는 shutdown"기준" 시간에서 하나 이상의 "깨우기 알람 시간"을 계산해야 했습니다(예: BASETIME에서 6시간). 내가 이해하는 한, -dor --date=옵션은 이 목적으로 사용되지만 올바른 결과를 얻지 못합니다.

    $ date '+%D %X' -d "${BASETIME} + 6 hours"
    05/03/21 04:03:43
    

    결과는 끝났습니다! ?- 이것은 분명히 잘못된 것입니다(적어도 내가 원하는 것은 아닙니다) man date.

    날짜 문자열 형식은 여기에 쉽게 설명된 것보다 더 복잡합니다.

    그리고

    전체 문서 [...]는 다음을 통해 로컬로 제공됩니다.info '(coreutils) date invocation'

    하지만 여기서도 유용한 것을 찾지 못했습니다.

    가까운 대안은 다음과 같습니다.

    $ date "+%D %X" -d '+ 6 hours'
    05/03/21 10:10:11
    

    이렇게 하면 정확한 알람 시간을 알 수 있습니다.하지만이는 BASETIME이 아닌 현재 시간을 기준으로 합니다.

내 질문은 다음과 같습니다

  • date '+%D %X' -d "${BASETIME} + 6 hours" 감소대신 시간증가시간?

  • 고정된 BASETIME에서 늘리는 올바른 방법은 무엇입니까?

참고: FWIW, 내 OS, 커널 및 date버전:

$ date --version
date (GNU coreutils) 8.30
...

$ hostnamectl
...
Operating System: Raspbian GNU/Linux 10 (buster)
          Kernel: Linux 5.10.17-v7+
...

답변1

핵심 문제는 생성된 날짜 문자열에 BASETIME=$(date "+%D %X")시간대가 포함되어 있지 않다는 것입니다. 사용하면 BASETIME=$(date "+%D %X %z")문제가 해결됩니다..

date '+%D %X' -d "${basetime} + 6 hours", + 6(또는 +6등 ) 의 경우 +06시간대 값으로 해석됩니다.

당신은 그것을 볼 수 있습니다암소 비슷한 일종의 영양 date --debug옵션(굵은색 광산):

$ date '+%D %X %z' -d "${basetime} + 6 hours" --debug
date: warning: value 5 has less than 4 digits. Assuming MM/DD/YY[YY]
date: parsed date part: (Y-M-D) 0021-05-03
date: **parsed time part: 14:03:43 UTC+06**
date: parsed relative part: +1 hour(s)
date: input timezone: parsed date/time string (+06)
date: warning: adjusting year value 21 to 2021
date: using specified time as starting value: '14:03:43'
date: starting date/time: '(Y-M-D) 2021-05-03 14:03:43 TZ=+06'
date: '(Y-M-D) 2021-05-03 14:03:43 TZ=+06' = 1620029023 epoch-seconds
date: after time adjustment (+1 hours, +0 minutes, +0 seconds, +0 ns),
date:     new time = 1620032623 epoch-seconds
date: timezone: system default
date: final: 1620032623.000000000 (epoch-seconds)
date: final: (Y-M-D) 2021-05-03 09:03:43 (UTC)
date: final: (Y-M-D) 2021-05-03 05:03:43 (UTC-04)
05/03/21 05:03:43 AM -0400

또한 시간이라는 단어는 "1시간 추가"로 해석됩니다.

TimeZone 값을 사용하여 시간을 표현하면 모든 문제가 해결됩니다. 다음 형식을
사용하는 것이 좋습니다 .%F %T %z

$ basetime=$(date "+%F %T %z"); echo "$basetime"
2021-05-03 18:31:43 -0400

$ date '+%F %T %z' -d "${basetime} + 6 hours"
2021-05-04 00:31:43 -0400

이것이 바로 미래입니다. "--debug" 옵션을 사용하여 계속 실행할 수 있습니다.

시간대(권장하지 않음)를 방지하는 해결 방법은 +6 hours정적 시간 값 앞에 상대 용어( )를 넣는 것입니다.

$ date -d "+6 hours 2021-05-03 18:31:43"
Tue 04 May 2021 12:31:43 AM EDT

답변2

아직 이 기록을 찾지는 못했지만장난date에 문자열을 할당할 때 사용하는 서식 순서 인 것 같습니다 BASETIME. 즉, 역방향주문하다%D/ 옵션에서 계산을 수행하여 올바른 %X(원하는) 결과를 생성합니다.-d--date=

$ BASETIME=$(date "+%X %D")
$ echo $BASETIME
15:00:28 05/03/21

$ date '+%D %X' -d "${BASETIME} + 6 hours"
05/03/21 21:00:28 
# note that the output format need not be the same as the `BASETIME` format

$ date '+%D %X' -d "${BASETIME} + 24 hours"
05/04/21 15:00:28 
# note that the date advances correctly 

$ date '+%D %X' -d "${BASETIME} + 15 minutes"
05/03/21 15:15:28

$ date '+%D %X' -d "${BASETIME} + 6 months"
11/03/21 15:00:28

$ date '+%D %X' -d "${BASETIME} + 26 weeks"
11/01/21 15:00:28

노트:

시간을 내어 질문을 한 후에 이 답변을 찾았습니다. 누군가에게 도움이 되길 바라며 여기에 글을 올립니다.

관련 정보