Bash Shell格式化日期显示,你需要格式化日期或时间,方便输出。
解决方案
使用包含 strftime 格式规格的 date 命令。
# 在脚本中设置环境变量会有所帮助:
$ STRICT_ISO_8601='%Y-%m-%dT%H:%M:%S%z' # 严格的ISO 8601格式
$ ISO_8601='%Y-%m-%d %H:%M:%S %Z' # 和ISO 8601差不多,但可读性更好
$ ISO_8601_1='%Y-%m-%d %T %Z' # %T等同于%H:%M:%S
$ DATEFILE='%Y%m%d%H%M%S' # 适合在文件名中使用
$ date "+$ISO_8601"
2006-05-08 14:36:51 CDT
$ gawk "BEGIN {print strftime(\"$ISO_8601\")}"
2006-12-07 04:38:54 EST
# 和先前的$ISO_8601一样
$ date '+%Y-%m-%d %H:%M:%S %Z'
2006-05-08 14:36:51 CDT
$ date -d '2005-11-06' "+$ISO_8601"
2005-11-06 00:00:00 CST
$ date "+Program starting at: $ISO_8601"
Program starting at: 2006-05-08 14:36:51 CDT
$ printf "%b" "Program starting at: $(date '+$ISO_8601')\n"
Program starting at: $ISO_8601
$ echo "I can rename a file like this: mv file.log file_$(date +$DATEFILE).log"
I can rename a file like this: mv file.log file_20060508143724.log
讨论
你也许倾向于将 +
添加到环境变量中,以此简化后续命令,但有些系统的 date 命令比较挑剔 +
的存在及其位置。我们的建议是明确将它写进 date 命令。
可用的格式化选项还有不少,完整的清单可参见系统的 date 手册页或 C 语言的 strftime() 函数。
除非指定,否则假定时区为系统所定义的当地时间。GNU date 命令使用的 %z
格式是一种非标准扩展,未必能在你的系统上使用。
ISO 8601 是显示日期和时间的推荐标准,应该尽一切可能使用。相较于其他显示格式,它具备多种优势:
- 公认的标准
- 不存在歧义
- 既易于阅读,又便于程序解析(例如,使用 awk 或 cut)
- 用于成列数据或文件名时,其排序结果符合预期
尽量避免 MM/DD/YY
或 DD/MM/YY
(甚至是更糟糕的 M/D/YY
或 D/M/YY
)这种格式。其排序结果不尽如人意,而且存在歧义,因为根据地理位置,日或月都可能是第一部分,这也令其难于解析。同样,尽量使用 24 小时制,避免出现更多的歧义和解析问题。
更多strftime支持的格式规格
酷客网相关文章:
评论前必须登录!
注册