내 쉘 스크립트를 살펴보세요
#!/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
먼저 $aaa
input()을 인식할 수 있는 형식으로 변환할 수 있습니다.@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