如何将YYYYMMDDHHMMSS转换为'date`可读的日期

时间:2010-11-16 18:27:28

标签: linux bash date sed

我有一组YYYYMMDDHHMMSS格式的日期/时间字符串,我希望将其转换为date实用程序可读的内容。通常,我可以这样做:

date -d "2010-10-01 12:34:56"

但是,date不喜欢YYYYMMDDHHMMSS:

date -d "20100101123456" ..无效日期

因此,我可能需要将字符串细化为先前格式。我在想sed就是答案,但它变得非常丑陋。我很确定我的字符串是正确的格式,所以如何轻松转换它们?

6 个答案:

答案 0 :(得分:8)

日期不允许“YYYYMMDDHHMMSS”,但它确实是“YYYYMMDD HH:MM:SS”,所以:

D="20100101123456"
date -d "${D:0:8} ${D:8:2}:${D:10:2}:${D:12:2}"

答案 1 :(得分:4)

如果格式是完全修复的,你可以在bash中完成,砍掉字符串:

d=20100101123456
pretty_date="${d:0:4}-${d:4:2}-${d:6:2} ${d:8:2}:${d:10:2}:${d:12:2}"
# 2010-01-01 12:34:56
...

我不打算尝试使用正则表达式 - 就像你说的那样,模式变得难看。很多重复([0-9]{4}),即使是扩展或perl正则表达式。或者你可以灵活地匹配.;没有验证。

答案 2 :(得分:2)

试试这个:

echo "20101106213245" | sed -r 's/^.{8}/& /;:a; s/([ :])(..)\B/\1\2:/;ta'

结果:

20101106 21:32:45
  • 在第八个字符后插入一个空格
  • [标签a]在空格或冒号和接下来的两个字符之后,添加冒号
  • 如果已进行替换,请转到标签

你也想要一些连字符吗?

echo "20101106213245" | sed -r 's/^.{4}/&-/;:a; s/([-:])(..)\B/\1\2:/;ta;s/:/-/;s/:/ /'

结果:

2010-11-06 21:32:45
  • 在第四个字符后插入连字符
  • [标签a]在连字符或冒号和接下来的两个字符后,添加冒号
  • 如果已进行替换,请转到标签
  • 将第一个冒号更改为连字符(2010-11:06:21:32:45 - > 2010-11-06:21:32:45
  • 将下一个冒号更改为空格(2010-11-06:21:32:45 - > 2010-11-06 21:32:45

答案 3 :(得分:1)

所有这些正则表达式的答案是什么? date(1)工具可以使用strftime()样式的日期格式化...一个将一种日期类型转换为另一种日期类型的例子:

$ date -j -f "%Y%m%d%H%M%S" "20100101123456" "+%Y-%m-%d %H:%M:%S"
2010-01-01 12:34:56

因此,如果它不是您想要的格式,请将其转换为然后再使用它。如果你只是想设置它,你可以简单地做:

$ date -f "%Y%m%d%H%M%S" "20100101123456"

答案 4 :(得分:0)

 sed -ne 's/\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1-\2-\3 \4:\5:\6/p'

我承认它很满口。所有的。应该最好是[0-9]或\ d,但我不记得sed是否支持后者。

答案 5 :(得分:0)

busybox date或bsd date接受输入格式的描述。

Busybox是一个GNU小实用程序,易于安装。

bsd格式已在另一个答案中介绍,所以这里是busybox:

$ busybox date -D "%Y%m%d%H%M%S" -d "20100101123456" +'%Y-%m-%d %H:%M:%S'
2010-01-01 12:34:56