如何在BASH中将ISO8601时间转换为指定时区的本地时间
解决ISO8601时间转指定时区本地时间的问题
我来帮你搞定这个时区转换的问题!你之前的命令主要是在变量赋值语法和date命令用法上出了点小问题,咱们一步步修正:
先说说你之前命令的问题
你写的 TZ="$timeZone" newSunrise=echo $date -d "$sunrise" +"%s" 有几个明显的错误:
- 变量赋值时,要捕获命令输出得用
$()或者反引号,直接写newSunrise=echo ...会把字符串"echo"赋值给变量,而不是命令的执行结果 - 这里应该调用系统的
date命令,而不是$date(除非你自定义了这个变量,但显然你是想用系统自带的时间工具) +%s会输出数字时间戳,而你需要的是易读的本地时间格式,得换成对应的格式串
正确的两种实现方法
方法1:临时设置TZ环境变量(兼容大多数Unix-like系统)
用 $() 捕获date命令的输出,同时通过TZ变量指定时区,这个时区只会对当前date命令生效,不会影响全局环境:
# 替换成你想要的易读格式,示例是"年-月-日 时:分:秒" newSunrise=$(TZ="$timeZone" date -d "$sunrise" +"%Y-%m-%d %H:%M:%S")
方法2:用GNU date的--timezone参数(更直观,Linux系统常用)
如果你的系统是Linux(使用GNU date),可以直接用--timezone(缩写-z)参数指定时区,不用临时设置环境变量:
newSunrise=$(date --timezone="$timeZone" -d "$sunrise" +"%Y-%m-%d %H:%M:%S")
自定义易读格式的例子
你可以根据需求调整格式串,比如:
- 要12小时制带AM/PM和时区缩写:
+"%I:%M %p %Z",输出类似05:36 AM MST - 要带星期和月份全称:
+"%A, %B %d %Y %I:%M %p",输出类似Saturday, November 09 2019 05:36 AM
实际测试示例
假设你的变量值是:
sunrise="2019-11-09T11:36:14+00:00" timeZone="America/Denver"
执行命令后,newSunrise 的值会是 2019-11-09 05:36:14(Denver时区比UTC晚7小时,当时处于MST时区)。
内容的提问来源于stack exchange,提问作者Geoff Fox
相关产品推荐
相关产品推荐

