您如何为迄今为止的输入指定格式?

Cor*_*ein 24 date

给定格式无法识别的日期和时间date,如何date识别日期和时间?

例如:

$ date -d "09SEP2012:23:58:46"
date: invalid date `09SEP2012:23:58:46'
$ date -d "09SEP2012:23:58:46" --magic-option "ddMMMYYY:hh:mm:ss"
Sun Sep  9 23:58:46 MDT 2012
Run Code Online (Sandbox Code Playgroud)

是否--magic-option存在?如果没有,是否有更优雅的方法来解决这个问题,而不是使用sed将输入转换为格式正确的日期字符串?

Gil*_*il' 10

POSIX 和 GNU 日期都没有--magic-option. FreeBSD 调用它-f(使用类似于date的输出格式说明符的语法,而不是您建议的那种)。

您的日期非常接近于被 GNU 日期识别:只需用空格替换将日期与时间分隔开的冒号。

date -d "$(echo "09SEP2012:23:58:46" | sed 's/:/ /')"
Run Code Online (Sandbox Code Playgroud)

  • 以及自定义格式?唯一的出路是正则表达式?这太可怕了:-( (2认同)
  • 您无法在不了解日期格式的情况下解析日期,经典示例是“01/02/03”。 (2认同)

hro*_*tyr 7

我编写了一堆工具(dateutils),它们以更脚本友好的方式处理日期和时间。你的魔法选项有--input-format|-i,例如:

dconv -i '%d%b%Y:%H:%M:%S' "09SEP2012:23:58:46"
=>
  2012-09-09T23:58:46
Run Code Online (Sandbox Code Playgroud)

虽然dconv不直接支持date的输出格式(它没有赋予TZ或环境的任何东西),有一个工具,strptimedateutils是不支持的%Z格式说明。


enh*_*nic 5

如果你使用的是已经安装好的Ubuntu这样的环境busybox,你可以这样做busybox date -D "$input_format" -d "$input",比如:

$ busybox date -D "%m/%d/%Y %H:%M:%S" -d "02/27/2013 23:48:00"
Wed Feb 27 23:48:00 CST 2013
Run Code Online (Sandbox Code Playgroud)

如果要将输出字符串格式化为非标准格式,可以使用 指定输出格式busybox date -D "$input_format" -d "$input" +"$output_format",例如

$ busybox date -D "%m/%d/%Y" -d "02/27/2013" +"%d.%-m.%y"
27.2.13
Run Code Online (Sandbox Code Playgroud)

但对于符合 ISO-8601 的日期,请-I按照所需的精度级别使用,例如:

$ busybox date -D "%m/%d/%Y %H:%M:%S" -d "02/27/2013 23:48:00" -Iseconds
2013-02-27T23:48:00-0600
Run Code Online (Sandbox Code Playgroud)

笔记

busybox手册页。这可能不适用于%Z区格式。