指定された時間(8時間など)のみを出力し、UTCタイムゾーンの変更に応じて時間を移動する必要があります。
私が見たい結果は次のとおりです。
Athens 15 16 17 18 19 20 21 22 (+2)
Hong_Kong 21 22 23 00 01 02 03 04 (+8)
date
私は命令で遊んで発見しました。SuperUserのこの興味深いコード。私には学ぶことがたくさんあります。私はそれを自分のニーズに合わせて調整しました。しかし、タイムゾーンの変更で論理的な問題を発見しました。ループが24時間の範囲を超えて継続時間を増やすことです。したがって、上記の例ではなく、次のように印刷されます。
Athens 15 16 17 18 19 20 21 22 (+2)
Hong_Kong 21 22 23 24 25 26 27 28 (+8)
これは明らかに間違っています。
コードはソートでネストされたループを使用します。生涯にわたって時間範囲を24桁に制限する方法はわかりません。
これは、作者のコードで何が起こっているのかについてのおおよそのアイデアです。 24時間以上屋根を防ぎ、23時から00時まで屋根をする方法は?
#!/bin/bash
timezones="2" #In the actual script this is a variable generated by a provided array of cities.
workday="08 20" #This specifies the displayed range of hours e.g working hours
for tz in `seq $timezones`
do
printf "City-$tz " # Just a placeholder, instead of an actual city from timezone file
timediff[$tz]=6. # This is a simplified command. IN the actual script time difference calculated from deducting my local time from enquiring city time zone
for h in `seq $workday` #loop hours
do
printf "%02d " $(($h++${timediff[$tz]}))
done
printf " \n"
done
出力
%
City-1 14 15 16 17 18 19 20 21 22 23 24 25 26
City-2 14 15 16 17 18 19 20 21 22 23 24 25 26
PS上記の例では、タイムラインのタイムゾーンの変更は表示されません。私はそれを実行する方法を知りません。
ベストアンサー1
timediff[$tz]=6.
整数演算のみをサポートするBashでは、ドット入力が機能しないため、スクリプトは実行されません。
とにかく、数列を22、23、0、1、...にするには、概念はモジュラー算術であり、C系列言語の演算子は%
。例えば
for i in 1 2 3 4 5; do
echo $(( i % 3 ))
done
印刷1 2 0 1 2
。% 24
もちろん、使う時間と同じです。もちろん、ユーザーは表示された時間がどの日かを知る必要があります。たとえば、UTC+0200からUTC+1200に変換されます。
mytz=2 othertz=12
for h in {8..16}; do
printf "%02d ($mytz) == %02d ($othertz)\n" "$h" "$(( (h - mytz + othertz) % 24))";
done
08 (+2) == 18 (+12)
などを与える
タイムゾーンの正しいファイル名がわかっている場合は、date
翻訳に環境変数を使用することもできます。TZ
GNUの日付はここで使用されます:
hour=08
tz=Asia/Hong_Kong
printf "local: %s\nother: %s\n" "$(date +"%F %T %Z (%z)" -d "@$ts")" "$(TZ=$tz date +"%F %T %Z (%z)" -d "@$ts")"
出力:
local: 2021-12-08 08:00:00 EET (+0200)
other: 2021-12-08 14:00:00 HKT (+0800)