如何将 POSIX 时间转换为奥尔森时区文件?

如何将 POSIX 时间转换为奥尔森时区文件?

我有 POSIX 格式的本地区域。

“太平洋夏令时间,M3.2.0/02:00,M11.1.0/02:00”

如何使用 zic 工具创建我自己的时区文件?

我从男人身上举了一个例子。

rule.infile 包含:

规则美国 1970 最长 - 九月星期日<=14 3:00 0 S

我愿意

zic-d。 -v 规则.infile

但输出是空的并且没有新文件。

选项 -p 有什么作用?

可以作为输入使用吗?

从手册上绝对不清楚。

更新: 规则文件应包含三个部分:规则、区域、链接。

通过更新的rule.infile,zic 正在生成一个文件。

现在我想了解如何定义第二个星期日。

答案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
}

相关内容