解析非标准日期格式

时间:2014-06-12 09:17:18

标签: bash parsing date

说我的日期输出格式如下:

date --utc +%d.%m.%Y,\ %H:%M\ UTC
# Outputs: 12.06.2014, 09:03 UTC

如何在另一个date来电中以另一种格式显示上面的输出日期?我试过了:

date --utc --date="12.06.2014, 09:03 UTC" +%d.%m.%Y,\ %H:%M\ UTC

但没有成功(它说invalid date)。

我主要是为了能够从输出日期告诉我们已经过了多少小时(或几天,或任何时间测量单位)。

2 个答案:

答案 0 :(得分:2)

以下是man date页面中有关--date选项格式的说明:

The --date=STRING is a mostly free format human readable date string such as
"Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42" or even "next
Thursday". A date string may contain items indicating calendar date, time of day,
time zone, day of week, relative time, relative date, and numbers. An empty
string indicates  the beginning of the day. The date string format is more
complex than is easily documented here but is fully described in the info
documentation.

因此您可以使用,例如:

date --date "2014-06-12 09:03 UTC" --utc +%d.%m.%Y,\ %H:%M\ UTC
# Output: 12.06.2014, 09:03 UTC

得到你想要的东西。

您可以使用sed行轻松地从第一个输出中获取第二个表单,如下所示:

sed 's/\([0-9]\{2\}\)\.\([0-9]\{2\}\)\.\([0-9]\{4\}\), \(.*\)/\3-\2-\1 \4/'
    <<< '12.06.2014, 09:03 UTC'
# Output: 2014-06-12 09:03 UTC

请注意,首次输出ISO 8601格式的日期可能会更快,以便重复使用,例如用:

date --utc +%F\ %H:%M\ UTC
# Output: 2014-06-12 10:12 UTC

答案 1 :(得分:1)

我认为您无法指定输入格式,因此您必须使用其他命令进行更改:

date  --utc  --date="$(echo "12.06.2014, 09:03 UTC" | sed -r 's/(..).(..).(....), (..):(..) UTC/\3-\2-\1 \4:\5 UTC/')"

此外,如果你想对此做出算术,你可以使用+%s

DATE1=$(date  "+%s"  --date="$(echo "12.06.2014, 09:03 UTC" | sed -r 's/(..).(..).(....), (..):(..) UTC/\3-\2-\1 \4:\5 UTC/')")
DATE2=$(date  "+%s"  --date="$(echo "17.06.2014, 08:30 UTC" | sed -r 's/(..).(..).(....), (..):(..) UTC/\3-\2-\1 \4:\5 UTC/')")
DIFF_IN_SECONDS=$(($DATE2-$DATE1))
DIFF_IN_RAW_DAYS=$(( ($DATE2-$DATE1)/86400 ))
DIFF_IN_DATES=$(( (($DATE2/86400) - ($DATE1/86400)) ))