%Y%m%d%H%M%S 형식의 문자열에서 시간을 추가하는 방법

%Y%m%d%H%M%S 형식의 문자열에서 시간을 추가하는 방법

내 쉘 스크립트를 살펴보세요

#!/bin/sh
aaa=20200101101010
bbb=$(date -d "$aaa -5 minutes" +'%Y%m%d%H%M%S')

echo $bbb

난 갖길 원해:

20200101100510

그러나 결과는 다음과 같습니다.

20200101101009235500

무슨 일이에요?

aaa에서 5분을 어떻게 빼나요?

보고싶다 20200101100510

답변1

date이를 현지 시간 20200101101010으로 해석하는 GNU 구현을 사용해야 합니다 .2020010110-10-10T00:00:00

-d예, 비표준 옵션 date, 몇 가지 구현에서만 지원되며 이를 지원하는 구현에서 날짜를 입력하려는 경우(예: GNU, busybox 또는 ast-open date, BSD는 대신 date사용 ) 다른 구현에서 거기에 있습니다. 은 다르다.-r-v

ast-open그리고 busybox를 사용 하면 오프셋 AFAIK가 없어도 date입력 형식(busybox with -D, ast-open with )을 지정할 수 있습니다. -p그러나 먼저 에포크 시간으로 변환하여 5분을 제거하고, 300초를 제거한 후 다시 원하는 형식으로 변환할 수 있습니다.

2019년 7월, GNU와 비슷한 것을 추가하자는 제안이 있었습니다.date하지만 아직 출시되지 않았습니다(2020-01-21 기준).

특히 GNU의 경우 date먼저 $aaainput()을 인식할 수 있는 형식으로 변환할 수 있습니다.@RakeshShewale의 ksh93문법 접근 방식.

zsh또 다른 옵션은 이식 불가능한 동작에 의존하지 않고 타임스탬프 구문 분석 및 형식 지정 기능이 내장된 셸을 사용하는 것입니다 date.

zmodload zsh/datetime || exit
format=%Y%m%d%H%M%S min=60

aaa=20200101101010

strftime -r -s bbb -- "$format" "$aaa" || exit
strftime    -s bbb -- "$format" "$((bbb - 5 * min))"
print -r -- "$bbb"

$format다른 형식에 대해 필요에 따라 조정할 수 있지만 모든 형식 지시어가 지원되는 것은 아닙니다 strftime().strftime-r체재타임스탬프) strptime()(호출자 strftime -r)분석하다타임스탬프). man 3 strftime시스템을 확인하십시오 man 3 strptime.

답변2

a=20200101101010
bbb=$(date --date "${a:0:4}-${a:4:2}-${a:6:2} ${a:8:2}:${a:10:2}:${a:12:2}")
ccc=$(date -d "$bbb -5 mins" +'%Y%m%d%H%M%S')
echo $ccc

산출:

20200101100510

관련 정보