如何将 YYYYMMDDHHMMSS 转换为“date”可读的日期

发布于 2024-10-03 12:08:18 字数 332 浏览 4 评论 0原文

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

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

但是,date 不喜欢 YYYYMMDDHHMMSS:

date -d "20100101123456"..invalid date

因此,我可能需要将字符串改进为先前的格式。我认为 sed 就是答案,但它很快就会变得丑陋。我非常确定我的字符串将是正确的格式,那么如何轻松地转换它们呢?

I have a set of date/time strings in the YYYYMMDDHHMMSS format that I want to convert to something readable by the date utility. Usually, I can do something like:

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

However, date does not like the YYYYMMDDHHMMSS:

date -d "20100101123456"..invalid date

So, I probably need to refine the string to be in the prior format. I'm thinking sed is the answer, but it gets ugly very fast. I'm quite certain my strings will be the proper format, so how do I easily convert them?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

紫竹語嫣☆ 2024-10-10 12:08:18

date 不允许“YYYYMMDDHHMMSS”,但它允许“YYYYMMDD HH:MM:SS”,所以:

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

date doesn't allow "YYYYMMDDHHMMSS", but it does "YYYYMMDD HH:MM:SS", so:

D="20100101123456"
date -d "${D:0:8} ${D:8:2}:${D:10:2}:${D:12:2}"
戏舞 2024-10-10 12:08:18

如果格式是完全固定的,你可以在 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 正则表达式也是如此。或者你可以灵活地匹配 .;没有验证。

If the format is totally fixed, you could just do it within bash, chopping up the string:

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
...

I wouldn't bother trying to use regex - like you said, the pattern gets ugly fast. A lot of repetition of ([0-9]{4}), even with extended or perl regex. Or you could be flexible and just match .; no verification.

王权女流氓 2024-10-10 12:08:18

所有这些正则表达式答案是怎么回事? 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"

What's with all of these regular expression answers? The date(1) tool has the ability to use strftime() style date formatting... an an example of converting one date type to another:

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

So if it's not in the format you want, convert it like that and then use it. If you just want to set it, you can simply do:

$ date -f "%Y%m%d%H%M%S" "20100101123456"
走过海棠暮 2024-10-10 12:08:18

试试这个:

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

结果:

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

您也想要一些连字符吗?

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

结果:

2010-11-06 21:32:45
  • 在第四个字符后插入一个连字符
  • [标签 a] 在连字符或冒号以及接下来的两个字符之后,添加一个冒号
  • 如果进行了替换,请转到标签 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)

Try this:

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

Result:

20101106 21:32:45
  • Insert a space after the eighth character
  • [label a] After a space or colon and the next two characters, add a colon
  • If a replacement was made, goto label a

You want some hyphens, too?

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

Result:

2010-11-06 21:32:45
  • Insert a hyphen after the fourth character
  • [label a] After a hyphen or colon and the next two characters, add a colon
  • If a replacement was made, goto label a
  • Change the first colon to a hyphen (2010-11:06:21:32:45 -> 2010-11-06:21:32:45)
  • Change the next colon to a space (2010-11-06:21:32:45 -> 2010-11-06 21:32:45)
潇烟暮雨 2024-10-10 12:08:18
 sed -ne 's/\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1-\2-\3 \4:\5:\6/p'

我承认这是拗口的。所有 . 最好应该是 [0-9] 或 \d,尽管我不记得 sed 是否支持后者。

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

I admit it'S a mouthful. All the .'s should optimally be [0-9] or \d, though I don't remember if sed supports the latter.

空城缀染半城烟沙 2024-10-10 12:08:18

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

Either busybox date or bsd date accept a description of the input format.

Busybox is a GNU small utility, easy to install.

The bsd format has been covered in another answer, so here is busybox:

$ busybox date -D "%Y%m%d%H%M%S" -d "20100101123456" +'%Y-%m-%d %H:%M:%S'
2010-01-01 12:34:56
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文