나는 초 단위의 시간 간격을 전달하고 있습니다 ts
.
ts=13
printf -v hours '%(%H)T' "$ts"
printf '%s\n' "ts: $ts ; hours: $hours"
이는 잘못된 결과입니다.
시간: 13시간: 12
보시다시피 13초가 걸리지 12
않습니다 .00
답변1
의견에서 논의한 것처럼 귀하의 문제는 시간대라고 생각합니다. %(...)T
시간을 현지 시간으로 인쇄합니다. 예를 들어 다음과 같습니다.
$ printf "%(%F %T %z)T\n" "$(date +%s)"
2021-08-21 19:58:45 +0300
TZ
하지만 시간대를 변경하려면 변수를 설정할 수 있어야 합니다 .
$ TZ=UTC printf "%(%F %T %z)T\n" "$(date +%s)"
2021-08-21 16:59:45 +0000
특히 매개변수는 epoch 이후의 초 수, 즉 1970년 1월 1일 00:00:00 UTC입니다. 이것은 간격이 아닌 특정 시점입니다. 그러나 조금 눈을 가늘게 뜨고 UTC를 사용해야 하며(그래서 시간대는 중요하지 않음) 연도를 무시하면 충분히 작은 값의 간격 길이로 처리할 수 있습니다.
지정자는 001에서 366 사이의 날짜를 제공하므로 이를 사용하면 일, 시간, 분, 초를 최대 1년까지 얻을 수 있습니다 strftime()
. 일수에는 1의 오프셋이 있습니다.%j
%H %M %S
$ TZ=UTC printf "%(%j %H %M %S)T\n" "$(( 123*86400 + 7*3600 + 6*60 + 5))"
124 07 06 05
또는 일부 평가 트릭을 사용하여 값을 변수에 할당합니다.
$ eval "$(TZ=UTC printf "%(daysplus1=%j hours=%H mins=%M secs=%S)T" \
"$(( 123*86400 + 7*3600 + 6*60 + 5))" )"
$ days=$((daysplus1 - 1))
$ echo $days $hours $mins $secs
123 07 06 05
물론, days=$((ts / 86400))
일수만 사용할 수 있으며 1년의 가치에 제한을 두지 않습니다.
아니면 수동으로 계산해 보세요.
secs=$(( ts % 60));
mins=$(( ts / 60 % 60 ));
hours=$(( ts / 3600 % 24));
days=$(( ts / 86400 ));
(이 eval
팁은 일부에서 가져온 것입니다.스티븐대답은 했는데 어느 것인지 기억이 나지 않습니다. )