如何在Shell中获取符合指定格式的当前系统日期时间
解决Shell中获取JSON兼容的ISO 8601 UTC时间格式问题
我来帮你搞定这个时间格式的问题!你需要的是符合ISO 8601标准的UTC时间格式(带毫秒和Z标识),这种格式是JSON官方认可的日期时间格式,刚好匹配你想要的2019-02-14T08:08:12.300Z样式。
问题分析
你当前的命令date +"%Y-%m-%d %T"存在三个核心问题:
- 用空格分隔日期和时间,而非标准的
T分隔符 - 缺少毫秒部分,无法满足
.300的精度要求 - 输出的是本地PST时区时间,而格式末尾的
Z要求必须是UTC时间
解决方案
根据你使用的date版本不同,提供两种可行的实现方式:
1. GNU Date(大部分Linux发行版适用)
如果你的主机是Ubuntu、CentOS这类常见Linux系统,直接使用带UTC模式和毫秒参数的命令即可:
CURRENTDATE=$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ") echo $CURRENTDATE
参数说明:
-u:强制切换到UTC时区输出,对应格式末尾的Z标识%3N:输出三位毫秒数,刚好匹配你需要的.300精度T:日期与时间之间的标准分隔符
执行后会得到类似这样的结果:2019-02-27T09:43:26.123Z(自动将你的本地PST时间转换为UTC时间)
2. BSD Date(MacOS系统适用)
从你显示的bash-3.2版本来看,你的主机大概率是MacOS,旧版BSD date不支持%3N参数,可通过拼接方式实现:
# 获取UTC日期时间主体部分 DATE_PART=$(date -u +"%Y-%m-%dT%H:%M:%S") # 将纳秒转换为三位毫秒数 MILLISECONDS=$(printf "%03d" $(( $(date +%N) / 1000000 )) ) # 拼接成最终格式 CURRENTDATE="${DATE_PART}.${MILLISECONDS}Z" echo $CURRENTDATE
如果你安装了Homebrew,也可以直接安装GNU版本的date(命名为gdate),然后复用第一种方式:
brew install coreutils CURRENTDATE=$(gdate -u +"%Y-%m-%dT%H:%M:%S.%3NZ") echo $CURRENTDATE
格式验证
生成的时间格式完全符合JSON规范,可以直接作为JSON字段值使用,例如:
{"event_time": "2019-02-27T09:43:26.123Z"}
内容的提问来源于stack exchange,提问作者ArrchanaMohan




