首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >POSIX数值时区

POSIX数值时区
EN

Stack Overflow用户
提问于 2017-01-12 03:04:03
回答 2查看 146关注 0票数 2

我可以得到这样的数字时区:

代码语言:javascript
复制
$ date +%z
-0600

然而,我最近发现POSIX只支持打印时区名称

代码语言:javascript
复制
$ date +%Z
CST

我可以在使用POSIX的同时获得shell或其他工具的数字版本吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-13 21:25:23

只有在您的时区和UTC之间的一天没有变化时,史蒂文·佩妮的回答才能工作。它还省略了会议记录,例如,如果你在印度,它就无法工作。

要说明这一点,您需要更多的日期信息:一年中的一天和一小时后的几分钟。

代码语言:javascript
复制
#!/bin/sh

T='+%j*1440+%H*60+%M' # minutes in year: DAY/Y * 1440 min/d + H * 60 h/min + MIN
Z=$(( ( $(date "$T") - ( $(date -u "$T") ) ) * 100 / 60 )) # TZ offset as hr*100

H=${Z%??} # hours ($Z is hundredths of hours, so we remove the last two digits)
if   [ $H -lt -13 ]; then H=$((H+8712))    # UTC is a year ahead
elif [ $H -gt  13 ]; then H=$((H%8736-24)) # UTC is a year behind
fi
if   [ $H -lt -13 ]; then H=$((H+24))      # UTC is a day ahead of a leap year
elif [ $H -gt  13 ]; then H=$((H-24))      # UTC is a day behind a leap year
fi

M=${Z#$H} # hundredths of hours (to become minutes on the next line)
if [ $M != 00 ]; then M=$(( $M * 60 / 100 )); fi # Minutes relative to 60/hr

printf '%+03d%02d' $H $M # TZ offset in HHMM

这允许您通过更改$TZ来更改时区,因此TZ=Asia/Calcutta myscript.sh应该会产生一个+0530的TZ偏移量。(本部分可能不适用于较旧的POSIX系统。)

票数 1
EN

Stack Overflow用户

发布于 2017-01-12 05:47:19

TZ变量由POSIX定义,因此我们可以遍历不同的时区,直到找到匹配的时区:

代码语言:javascript
复制
q=$(date +%H)
x=-12
while [ "$x" -le 11 ]
do
  y=$(TZ=UTC"$x" date +%H)
  if [ "$y" = "$q" ]
  then
    printf '%+03d00\n' "$((-x))"
    break
  fi
  x=$((x + 1))
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41604433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档