如何在 bash 中获取 UTC 时间和本地时间(以秒为单位)之间的差异?
%s
并不是答案的平凡部分,纪元秒明确是UTC(或者如果你是老派的话可能是GMT),所以设置TZ不会影响它。
类似于 twalberg 的建议:
IFS=":" read hh mm < <(date +%:z)
echo $(($hh*3600+$mm*60))
您可以通过为
date
命令设置 TZ 来测试这是否正在执行您想要的操作:
IFS=":" read hh mm < <(TZ=Australia/Sydney date %:z) # answer is 39600
IFS=":" read hh mm < <(TZ=US/Eastern date +%:z) # answer is -18000
(这不是严格 bash 答案,因为它需要 GNU 日期或同等版本,5.90 及更高版本支持 %:z 和 %::z)
您可能需要做一些工作才能在几秒钟内获得它,但是
date +%z
会将您配置的时区偏移报告为 [+-]HHMM
。解析其输出并进行适当的数学计算以在几秒钟内计算出来。
这只适用于整小时而不是分钟的地方。
echo $(($( date +%z)*36))
Spuratic 先生给出的答案并不完全正确,因为负数处理不当。这会影响 2016 年之前纽芬兰和委内瑞拉的居民。
对于更正确的变体(需要 2013 年之前发布的 gnu-libc、date 和 Bash 命令):
utc_offset ()
{
local z r;
read z < <( date +%z );
(( r= 0 ${z:0:1} ( ${z:1:2}*3600 + ${z:3:2}*60 ) ));
echo $r
}
示例:
TZ=US/Eastern utc_offset
-14400
(w/summer time)
TZ=Australia/Sydney utc_offset
39600
TZ=Asia/Kolkata utc_offset
19800
TZ=Canada/Newfoundland utc_offset
-9000
(not -5400 !)