22 23 00 01のように24時間周期で並べ替える方法

22 23 00 01のように24時間周期で並べ替える方法

指定された時間(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翻訳に環境変数を使用することもできます。TZGNUの日付はここで使用されます:

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)

おすすめ記事