POSIX形式のローカル領域があります。
「太平洋夏時間、M3.2.0/02:00、M11.1.0/02:00」
zicツールを使用して独自のタイムゾーンファイルを作成するにはどうすればよいですか?
一人の男の例を挙げました。
rule.infile には以下が含まれます。
Rules America 1970 最長 - 9月日曜日<=14 3:00 0 S
はい
zic-d。 -v ルール.infile
ただし、出力は空であり、新しいファイルはありません。
-pオプションは何をしますか?
入力として使用できますか?
マニュアルには確かに明確ではありません。
修正する: ルールファイルには、ルール、ゾーン、リンクの3つの部分を含める必要があります。
更新されたrule.infileを使用すると、zicはファイルを生成します。
今度は2番目の日曜日を定義する方法を理解したいと思います。
答え1
特別な場合に必要だったので、小さなbashスクリプトを作成しました。
私はこれがすべての状況に対処するわけではないことを知っています。ただし、少なくとも参考のために使用できます。私の使命は、文字列を解析することです。
"EST%dEDT%d、月 %d.%d.%d/%d:%d、月 %d.%d.%d/%d:%d"
例:
EST5EDT4、M1.3.0/2:00、M11.2.6/2:00
$1 - POSIX 文字列 $2 - 出力フォルダパス $3 - 出力ファイル名
timezoneposix2olson()
{
posix=$1
MONTHS=(ZERO Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
DAYS=(Sun Mon Tue Wed Thu Fri Sat)
IFS=',' tokens=( $posix )
# parse EST5EDT4
tmp=${tokens[0]#*EST}
no_dst_offset=${tmp%EDT*}
no_dst_offset=$(( no_dst_offset*-1 ))
dst_offset=${tokens[0]#*EDT}
dst_offset=$(( dst_offset*-1 ))
#parse M1.3.0/2:00
switch_time1=${tokens[1]#*/}
temp=${tokens[1]#*M}
switch_month1=${temp%%.*}
temp=${tokens[1]#*.}
switch_week1=${temp%.*}
temp=${tokens[1]##*.}
switch_day1=${temp%/*}
#parse M11.2.6/2:00
switch_time2=${tokens[2]#*/}
temp=${tokens[2]#*M}
switch_month2=${temp%%.*}
temp=${tokens[2]#*.}
switch_week2=${temp%.*}
temp=${tokens[2]##*.}
switch_day2=${temp%/*}
if [ $switch_week1 -eq 5 ] ; then
rule_day1=last${DAYS[$switch_day1]}
else
rule_day1=$(( (switch_week1-1)*7+1 ))
rule_day1="${DAYS[$switch_day1]}>=${rule_day1}"
fi
if [ $switch_week2 -eq 5 ] ; then
rule_day2=last${DAYS[$switch_day2]}
else
rule_day2=$(( (switch_week2-1)*7+1 ))
rule_day2="${DAYS[$switch_day1]}>=${rule_day2}"
fi
delta=$((dst_offset - no_dst_offset))
delta="${delta#-}:00"
if [ $dst_offset -gt 0 ] ; then
offset_mod1="+$dst_offset"
else
offset_mod1=$dst_offset
fi
if [ $no_dst_offset -gt 0 ] ; then
offset_mod2="+$no_dst_offset"
else
offset_mod2=$no_dst_offset
fi
local olson_file="$2/$3.zone"
echo "Rule LOCAL 1996 max - ${MONTHS[$switch_month1]} $rule_day1 $switch_time1 $delta $offset_mod1" > $olson_file
echo "Rule LOCAL 1996 max - ${MONTHS[$switch_month2]} $rule_day2 $switch_time2 0 $offset_mod2" >> $olson_file
echo "Zone Localtime $no_dst_offset LOCAL GMT%s" >> $olson_file
zic -d $2 -v $olson_file
}