Bash Shell格式化日期显示

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/YYDD/MM/YY(甚至是更糟糕的 M/D/YYD/M/YY)这种格式。其排序结果不尽如人意,而且存在歧义,因为根据地理位置,日或月都可能是第一部分,这也令其难于解析。同样,尽量使用 24 小时制,避免出现更多的歧义和解析问题。

更多strftime支持的格式规格

Bash Shell格式化日期显示

Bash Shell格式化日期显示

Bash Shell格式化日期显示

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!