我想知道如何在OS X上使用 01 / Mar / 2011 的shell转换为 2011-03-01 ?
在我的bash中:
bash-3.2$ date -d "03 Mar 2011" +%F
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
感谢@ghoti,在OS X上应该使用:
date -j -f '%d %b %Y' "02 JUN 2011" '+%F'
Failed conversion of ``02 JUN 2011'' using format ``%d %b %Y''
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
但是,我的系统显示> date +%b 7
,%b
是一个数字,而不是缩写的月份名称。
感谢。
答案 0 :(得分:1)
使用BSD日期,您可以使用-f
选项将一种格式转换为另一种格式。
例如,将输入放入变量中,以便您可以看到如何重复使用此日期命令:
$ d="27 JUN 2011"
$ date -j -f '%d %b %Y' "$d" '+%F'
2011-06-27
您可以man date
查看一切是如何运作的,但基本知识是这样的;
-j
告诉命令只处理输入而不是尝试设置系统时钟。-f this that
使用this
作为输入格式来解释that
。+yadda
使用指定的输出格式打印解释日期。有关输入格式的详细信息,在OS X或大多数BSD上,您可以man strftime
。
答案 1 :(得分:0)
我们的想法是将日期STRING转换为纪元时间,然后将其输出为您想要的格式。
我在Cygwin和CentOS上测试过它。
将日期STRING转换为纪元时间
使用命令'date -d STRING +%s',STRING可以是2011年3月1日或2011年3月1日或2011年3月1日
date -d '01 Mar 2011' +%s
1298908800
输出纪元时间格式
使用命令'date -d @EPOCH_TIME'+%Y-%m-%d'
date -d @1298908800 '+%Y-%m-%d'
2011-03-01
因为您的日期STRING 01 / Mar / 2011不是日期-d的有效格式,所以您必须使用'sed'进行转换。
echo "01/Mar/2011"|sed -e 's/\// /g'
01 Mar 2011
所以您的解决方案可以
old_date="01/Mar/2011"
date_string=`echo "$old_date"|sed -e 's/\// /g'`
echo $date_string
01 Mar 2011
epoch_time=`date -d "$date_string" +%s`
echo $epoch_time
1298908800
date -d @$epoch_time '+%Y-%m-%d'
2011-03-01