我有一组YYYYMMDDHHMMSS格式的日期/时间字符串,我希望将其转换为date
实用程序可读的内容。通常,我可以这样做:
date -d "2010-10-01 12:34:56"
但是,date
不喜欢YYYYMMDDHHMMSS:
date -d "20100101123456"
..无效日期
因此,我可能需要将字符串细化为先前格式。我在想sed
就是答案,但它变得非常丑陋。我很确定我的字符串是正确的格式,所以如何轻松转换它们?
答案 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
你也想要一些连字符吗?
echo "20101106213245" | sed -r 's/^.{4}/&-/;:a; s/([-:])(..)\B/\1\2:/;ta;s/:/-/;s/:/ /'
结果:
2010-11-06 21:32:45
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