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 年开始更新微信公众号后确实陷入了误区,为了尽可能多的浏览量而忽视了对工作的记录,再加上最近两年太懒而提不起笔来,导致连每个季度的工作总结都没能坚持写下去,就更别说技术文章了。 希望今天这篇文章是一个新周期的起点,本博客将更加注重对工作心得的记录,勤动笔少做梦,放弃不切实际的大文章想法,不要因为技术点太小觉得不需要写博文,积极总结工作学习经验,保持对写作的热情。