POSIX 시간을 Olson 시간대 파일로 변환하는 방법은 무엇입니까?

POSIX 시간을 Olson 시간대 파일로 변환하는 방법은 무엇입니까?

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 옵션은 무엇을 합니까?

입력으로 사용할 수 있나요?

매뉴얼에는 확실히 명확하지 않습니다.

고쳐 쓰다: 규칙 파일에는 규칙, 영역 및 링크의 세 부분이 포함되어야 합니다.

업데이트된 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
}

관련 정보