2017-01-12 13 views
1

私はこのような数値のタイムゾーンを取得することができますPOSIX数値タイムゾーン

$ date +%Z 
CST 

私は数値を得ることができます:私は最近、POSIX日のみ timezone nameを印刷サポートしていることを発見しかし

$ date +%z 
-0600 

をバージョンが POSIXのままでシェルや他のツールを使用していますか?

答えて

0

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 
0

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システムでは動作しないかもしれません)

関連する問題