bash中格式化日期的错误

时间:2016-03-30 15:44:47

标签: bash

我有这个约会" 05/11/2015 23:45"表示为" dd / mm / YY H:M"我想加上一定的时间,让我们说2天。

当我尝试执行这些命令时,我得到了以下结果:

date_time_start=`date -d "05/11/2015 23:45" +%d/%m/%Y" "%H:%M` 
echo $date_time_start
11/05/2015 23:45 

订单已在日和月之间反转

现在,如果我这样做:

date_time_end=`date -d "$date_time_start 2 day" +%d/%m/%Y" "%H:%M`
echo $date_time_end
07/11/2015 23:45 

2天已正确添加,订单为d / m / Y!

你能告诉我我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

你的第一次观察是错误的。当您有一个日期“05/11/2015”并将其作为日期输入传递时,它将以“mm / dd / YY”的形式读取。表单+“%d /%m /%Y”是日期工具的输出形式,因此您的第一个输出似乎是正确的,因为您只是交换月和日。

但是在第二步中,月份和日期再次交换,而05被解释为白天。所以计算是正确的,因为双重交换错误。

答案 1 :(得分:1)

您的假设是+"& d /%m /%Y%H:%M"将以该格式告诉它在日期中读取的格式,但是以该格式输出日期。它将使用该格式以m / d / Y H:M读入。 (另外,引用整个字符串,而不是空格)。这种误解造成了你所有的困惑

答案 2 :(得分:1)

您需要以避免错误解释的格式输入 您在文本中的日期为:05/11/2015 23:45按日期解释为m/d/Y(美国撰写日期的方式)。

$ date -ud "05/11/2015 23:45"
Mon May 11 23:45:00 UTC 2015

很明显,05正在date读取May(一年中的第五个月),而不是一天。

然后,当您设置输出格式时,将重复该错误:

$ date -d "05/11/2015 23:45" +%d/%m/%Y" "%H:%M
11/05/2015 23:45

月份显示为05(不是您想要的月11)。

可悲的是,除了以美国中心开发人员定义的格式创建日期之外,没有其他解决方案:

$ date -ud "11/05/2015 23:45"
Thu Nov  5 23:45:00 UTC 2015

或采用相反的国际公认方式:

$ date -ud "2015/11/05 23:45"
Thu Nov  5 23:45:00 UTC 2015

无论哪种方式,您都需要更改日期字符串。

然后,您可以添加两天:

$ date -ud "2015/11/05 23:45 2days" +%d/%m/%Y" "%H:%M
07/11/2015 23:45

我会坚持建议您使用2015/11/05来避免日期问题。

$ date -ud "2015/11/05 23:45 2days" +%Y/%m/%d" "%H:%M
2015/11/07 23:45