私はこのような数値のタイムゾーンを取得することができますPOSIX数値タイムゾーン
$ date +%Z
CST
私は数値を得ることができます:私は最近、POSIX日のみ timezone nameを印刷サポートしていることを発見しかし
$ date +%z
-0600
をバージョンが POSIXのままでシェルや他のツールを使用していますか?
私はこのような数値のタイムゾーンを取得することができますPOSIX数値タイムゾーン
$ date +%Z
CST
私は数値を得ることができます:私は最近、POSIX日のみ timezone nameを印刷サポートしていることを発見しかし
$ date +%z
-0600
をバージョンが POSIXのままでシェルや他のツールを使用していますか?
TZ variableはPOSIXで定義されているので、私たちは、私たちは一致するものを別の時間をループを見つけることができます ゾーンまで:
q=$(date +%H)
x=-12
while [ "$x" -le 11 ]
do
y=$(TZ=UTC"$x" date +%H)
if [ "$y" = "$q" ]
then
printf '%+03d00\n' "$((-x))"
break
fi
x=$((x + 1))
done
Steven Penny's answer日は、あなたのタイムゾーンとUTCの間で変更されていない場合にのみ機能します。また、分を省略しています。たとえばインドにいる場合は機能しません。
これを考慮するには、より多くの日付情報が必要です。年月日から1時間後の日。
#!/bin/sh
T='+%j*1440+%H*60+%M' # minutes in year: DAY/Y * 1440 min/d + H * 60 h/min + MIN
Z=$((($(date "$T") - ($(date -u "$T"))) * 100/60)) # TZ offset as hr*100
H=${Z%??} # hours ($Z is hundredths of hours, so we remove the last two digits)
if [ $H -lt -13 ]; then H=$((H+8712)) # UTC is a year ahead
elif [ $H -gt 13 ]; then H=$((H%8736-24)) # UTC is a year behind
fi
if [ $H -lt -13 ]; then H=$((H+24)) # UTC is a day ahead of a leap year
elif [ $H -gt 13 ]; then H=$((H-24)) # UTC is a day behind a leap year
fi
M=${Z#$H} # hundredths of hours (to become minutes on the next line)
if [ $M != 00 ]; then M=$(($M * 60/100)); fi # Minutes relative to 60/hr
printf '%+03d%02d' $H $M # TZ offset in HHMM
これは、あなたがそうTZ=Asia/Calcutta myscript.sh
が+0530
のオフセットTZを得なければならない、$TZ
を変更することによって、タイムゾーンを変更することができます。 (この部分は古いPOSIXシステムでは動作しないかもしれません)