You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动