在bash中将字符串转换为日期

56

我有一个格式为“yyyymmdd”的字符串。它是bash中的一个字符串,我想把它转换成日期,以便可以在其上使用所有其他日期函数。

将“20121212”字符串转换为格式为“%Y%m%d”的“20121212”日期。


1
Bash没有日期类型。你所说的“所有其他日期函数”是什么? - Thomas
1
假设我想在一个日期上加7天。我认为这可以在Bash上完成。这绝不是简单的整数加法。 - Yahoo-Me
可能是 在Bash中解析日期 的重复问题。 - Dave Jarvis
4个回答

61

这对我起作用了:

date -d '20121212 7 days'
date -d '12-DEC-2012 7 days'
date -d '2012-12-12 7 days'
date -d '2012-12-12 4:10:10PM 7 days'
date -d '2012-12-12 16:10:55 7 days'

那么您可以添加参数“+%Y%m%d”来格式化输出


@CMCDragonkai now=$(date -Im) 将当前时间存储为 ISO-8601 格式的日期/时间,精确到分钟,而 date -d = $now 对该格式非常满意。但我不确定是否所有与 ISO-8601 兼容的变体都是如此。 - mc0e
这确实很有用,gnu日期还可以执行诸如转换时区之类的操作,但是可能还有许多其他日期操作任务。例如,获取日期之间的差异以获得时间间隔;将日期和时间间隔舍入到给定精度(向下舍入、向上舍入和四舍五入);或者更进一步,如何找到从日期X开始10个工作日后的日期(考虑给定国家的假期)。是否有更全面的适合脚本使用的工具? - mc0e
@CMCDragonkai 是的,我在考虑用CLI封装一个现有的库似乎是个好主意。话说,在任何人过于匆忙之前,阅读这篇文章是值得的。如果有一个好的C或C++库可用,最好的解决方案可能是围绕它构建一个CLI。 - mc0e
5
为什么您在所有示例中都加入了“7天”?没有这些数据也可以工作。只需使用“date -d '20121212' +%Y%m%d”即可实现作者想要的功能。 - Victor Perov
2
@VictorPerov 这是作者在他的问题评论中要求的。 - Torsten
显示剩余2条评论

39
我们可以使用date的-d选项。
1)将格式更改为"%Y-%m-%d"格式,即将20121212更改为2012-12-12。
1)将日期格式更改为"%Y-%m-%d"格式,例如将20121212更改为2012-12-12。
date -d '20121212' +'%Y-%m-%d'

2)给定一个日期20121212,获取其前7天的日期并指定格式。

date -d '20121212 -7 days' +'%Y-%m-%d'

3)如果我们将日期存储在某个变量中,比如dat

dat2=$(date -d "$dat -1 days" +'%Y%m%d')

我正好在寻找第三个解决方案,谢谢@minhas23。 - Abu Shoeb

12

只能使用GNU date(通常附带于Linux)来处理日期。

对于OS X,有两个选择:

  1. 更改命令(已验证)

    #!/bin/sh
    #DATE=20090801204150
    #date -jf "%Y%m%d%H%M%S" $DATE "+date \"%A,%_d %B %Y %H:%M:%S\""
    date "Saturday, 1 August 2009 20:41:50"
    

    点击此处下载Coreutils - GNU 核心工具集(尚未验证)

    点击此处了解如何将字符串日期加1


5
只需使用date命令的-d选项,例如:
date -d '20121212' +'%Y %m'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接