date命令格式化输出日期字符串

目录

本文介绍如何使用 Linux 的 date 命令对日期字符串进行格式化输出。

date 命令简介

date 命令默认打印系统当前时间。 例如

date
Fri Oct 13 22:14:50 CST 2023

date 命令支持对输出字符串进行格式化,通过 +"格式化字符串" 实现,类似 Python 中 datetime.datetime.strftime 函数。 例如

date +"%Y-%m-%d %H:%M:%S"
2023-10-13 22:18:59

还可以通过 --date 参数指定具体的时间,而不是用系统当前时间,类似 Python 中 datetime.datetime.strptime。 例如

date --date "2023-10-03 12:00" 
Tue Oct  3 12:00:00 CST 2023

--date+ 可以同时使用,用于格式化输出日期字符串。 例如:

date --date "2023/10/03 12:00" +"%Y-%m-%d %H:%M:%S"
2023-10-03 12:00:00

下面用一个实际的例子说明具体用法。

应用

数值天气预报模式 Fotran 程序输出的二进制文件通常会附带一个 CTL 文件用于描述文件内容,可以被 GrADS、NCL 等绘图工具识别。

下面是杭州亚运会 CMA-MESO 1KM 模式输出 postvar 文件的 CTL 文件样例(部分内容省略):

dset ^postvar2023090312%f300
options  little_endian template
title post grib2 output from grapes
undef 9.999E+20
xdef   890  linear    70.0000    0.0900
ydef   646  linear     2.0000    0.0900
zdef   26 levels
    1000.000
    975.0000
    # ...skip...
    30.00000
    20.00000
    10.00000
tdef    73 linear 12Z03SEP2023    60mn
vars 32
u 26 0 u_wind
v 26 0 v_wind
# ...skip...
tslb  4 0 tslb
mslb  4 0 mslb
endvars

对于不同起报时次的 CTL 文件来说,仅有和时间相关的两行有区别:

  • 第 1 行 dset 文件名中有起报日期和时次 2023090312
  • tdef 行有起报时刻 12Z03SEP2023

业务系统中通常使用第一行文件名中的数字格式表示起报时次,例如 2023090312 表示 2023 年 9 月 3 日 12 时次。

如果单独生成一个 CTL 文件,就需要将数字格式的日期表示为 tdef 中月份为三位大写字母 (SEP) 的格式。

下面介绍如何实现。

使用 ECF_DATE 表示日期,HH 表示时次

ECF_DATE=20230903
HH=12

提取年(YYYY)、月(MM)、日(DD

YYYY=$(echo ${ECF_DATE} | cut -c1-4)
MM=$(echo ${ECF_DATE} | cut -c5-6)
DD=$(echo ${ECF_DATE} | cut -c7-8)

使用 date 命令格式化日期字符串

time_string=$(date -d "${YYYY}-${MM}-${DD} ${HH}:00" +"%HZ%d%b%Y")
echo ${time_string}
12Z03Sep2023

输出的月份只有第一个字母大写,使用 tr 命令将所有字母改为大写

time_string=$(echo ${time_string} | tr '[:lower:]' '[:upper:]')
echo ${time_string}
12Z03SEP2023

自此已得到生成 CTL 文件需要的时间字符串。 对不同时次来说,仅有时间不一样,其他部分完全相同,可以用 cat 命令写入 CTL 文件。

cat > post.ctl_${ECF_DATE}${HH} <<EOF
dset ^postvar${ECF_DATE}${HH}%f300
# ...skip...
tdef    73 linear ${time_string}    60mn
# ...skip...
EOF

参考

本文参考百度文心一言给出的回答。

后记

以下内容与本文无关

大语言模型极大提高了编程工作的生产效率,尤其是对于本文这类非常简单的任务,程序员不需要再从搜索引擎给出的众多结果中找到自己需要的代码,大模型会直接给出基本可用的代码片段。

当大家都从大模型中获取编程信息时,使用搜索引擎查找技术信息的频次就会逐渐下降,而依赖搜索引擎引流的博客文章也就越来越没有人访问了。 类似本文介绍的简单技术完全可以通过大模型得到答案,甚至本文参考资料就来自大模型,这类文章就更没人看了。 在这种趋势下,笔者应该想想创建博客的初衷,看看本博客的副标题:

体味流逝的每一个瞬间,珍惜幸福的每一段时光,记住曾经的每一次感动。

最近两年写博文数量越来越少,一是因为自己比较懒,另一个是因为自己觉得写些简单的技术文章没什么人看。 所以简单的文章不想写,有深度的文章不想花精力去写,导致什么都没写。 其实,笔者应该想起自己多年前写博客的原因,是为了记录日常学习生活工作中的心得体会,而不是为了获取更多的访问量。 笔者从 2020 年开始更新微信公众号后确实陷入了误区,为了尽可能多的浏览量而忽视了对工作的记录,再加上最近两年太懒而提不起笔来,导致连每个季度的工作总结都没能坚持写下去,就更别说技术文章了。 希望今天这篇文章是一个新周期的起点,本博客将更加注重对工作心得的记录,勤动笔少做梦,放弃不切实际的大文章想法,不要因为技术点太小觉得不需要写博文,积极总结工作学习经验,保持对写作的热情。